![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Verus |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 120 Регистрация: 5.8.2008 Репутация: нет Всего: нет |
char** parseurl(char* url)
{ char** tmp; char* pos = strstr(url, "|"); tmp = (char**)malloc(sizeof(char*)*2); int int_pos = (int) (pos-url); tmp[0] = (char*)malloc(10); tmp[1] = (char*)malloc(strlen(url)-int_pos); memcpy(tmp[0], url, int_pos); memcpy(tmp[1], url+int_pos+1, strlen(url)-int_pos); int a = strlen(url); int b = strlen(tmp[0]); int c = strlen(tmp[1]); return tmp; } Есть код. Вопрос знатокам почему b == int_pos ? Хотя должно равняться 10. Нужные для обращения внимания строки выделил ![]() Спасибо. Это сообщение отредактировал(а) Verus - 7.8.2008, 16:08 |
|||
|
||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
Verus |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 120 Регистрация: 5.8.2008 Репутация: нет Всего: нет |
||||
|
||||
Alek86 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
дебаг тебе поможет
|
|||
|
||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
Verus |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 120 Регистрация: 5.8.2008 Репутация: нет Всего: нет |
||||
|
||||
Verus |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 120 Регистрация: 5.8.2008 Репутация: нет Всего: нет |
Появился еще вопрос. Ведь malloc выделяет память под сколько то переменных данного типа. Почему в винде выделяет tmp[0] = (char*)malloc(sizeof(url)); вот так нормально а в линуксе ругается. Зато там выделяет tmp[0] = (char*)malloc(strlen(url)); вот так нормально и как мне надо по длине.
|
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Verus, проблема не в malloc() и операционках, а в том, что кто-то не читает документацию...
У тебя url - это указатель на char. sizeof(char*) == sizeof(void*) и для 32-х битных систем == 4. strlen определяет размер строки, находящуюся в памяти, начиная с ячейки, на которую указывает указатель. Это сообщение отредактировал(а) bsa - 8.8.2008, 10:37 |
|||
|
||||
Verus |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 120 Регистрация: 5.8.2008 Репутация: нет Всего: нет |
Выделяет кол-ом байт, понятно. Тогда как правильно выделять память если я хочу скопировать часть строки url в tmp[0]?
при выполнении этого кода в tmp[0] в конце строки дописывается какой-то мусор Это сообщение отредактировал(а) Verus - 8.8.2008, 11:01 |
|||
|
||||
Lycifer |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 144 Регистрация: 4.11.2007 Репутация: нет Всего: нет |
int int_pos = (int) (pos-url); что ты здесь получеш?
А так же /0 -конец - строки |
|||
|
||||
Verus |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 120 Регистрация: 5.8.2008 Репутация: нет Всего: нет |
Получаю позицию на которой находится символ "|" |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Verus
память под строки надо выделять на 1 символ больше - он нужен для идентификатора конца строки (символ '\0'). Строки копировать удобнее не memcpy(), а strcpy(), которая копирует и этот идентификатор. |
|||
|
||||
Verus |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 120 Регистрация: 5.8.2008 Репутация: нет Всего: нет |
strcpy(); скопирует всю строку, а мне надо только часть, поэтому я в memcpy() указываю сколько нужно скопировать. Копируется столько сколько мне надо, но почему то в конец еще что-то дописывается, разные символы. Пробовал выделять память и так tmp[0] = (char*)malloc(sizeof(url)); и так tmp[0] = (char*)malloc(strlen(url)); - так получается не то. Вот я и спрашиваю как правильно выделять надо память? |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Verus, в конец ничего не дописывается. там просто "мусор". Ты должен сам вручную поставить символ конца строки. Например, так:
|
|||
|
||||
Verus |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 120 Регистрация: 5.8.2008 Репутация: нет Всего: нет |
Спасибо большое. |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |