Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите понять, какая-то ахинея =) 
:(
    Опции темы
Verus
Дата 7.8.2008, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 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.
Нужные для обращения внимания строки выделил smile
Спасибо.

Это сообщение отредактировал(а) Verus - 7.8.2008, 16:08
PM MAIL   Вверх
Daevaorn
Дата 7.8.2008, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(Verus @  7.8.2008,  17:06 Найти цитируемый пост)
Хотя должно равняться 10.

А почему вы так думаете?
PM MAIL WWW   Вверх
Verus
Дата 7.8.2008, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 5.8.2008

Репутация: нет
Всего: нет



Цитата(Daevaorn @ 7.8.2008,  16:10)
Цитата(Verus @  7.8.2008,  17:06 Найти цитируемый пост)
Хотя должно равняться 10.
А почему вы так думаете?


Исходя из той логики что c == столько сколько указываешь =)
Мне вот и интересно что я упустил.

Это сообщение отредактировал(а) Verus - 7.8.2008, 16:26
PM MAIL   Вверх
Alek86
Дата 7.8.2008, 16:31 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



дебаг тебе поможет


--------------------
user posted image    user posted image
PM MAIL   Вверх
Daevaorn
Дата 7.8.2008, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(Verus @  7.8.2008,  17:24 Найти цитируемый пост)
Исходя из той логики что c == столько сколько указываешь =)

Ответьте себе на вопрос: а что делает malloc и strlen?
PM MAIL WWW   Вверх
Verus
Дата 7.8.2008, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 5.8.2008

Репутация: нет
Всего: нет



Цитата(Daevaorn @ 7.8.2008,  16:37)
Цитата(Verus @  7.8.2008,  17:24 Найти цитируемый пост)
Исходя из той логики что c == столько сколько указываешь =)

Ответьте себе на вопрос: а что делает malloc и strlen?

Спасибо за то что указали направление. Совсем что-то я...аж стыдно стало =)))
PM MAIL   Вверх
Verus
Дата 8.8.2008, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 5.8.2008

Репутация: нет
Всего: нет



Появился еще вопрос. Ведь malloc выделяет память под сколько то переменных данного типа. Почему в винде выделяет tmp[0] = (char*)malloc(sizeof(url)); вот так нормально а в линуксе ругается. Зато там выделяет tmp[0] = (char*)malloc(strlen(url)); вот так нормально и как мне надо по длине.
PM MAIL   Вверх
bsa
Дата 8.8.2008, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Verus, проблема не в malloc() и операционках, а в том, что кто-то не читает документацию...
Цитата(man 3 malloc)
SYNOPSIS
       #include <stdlib.h>

       void *malloc(size_t size);

DESCRIPTION
       malloc()  allocates  size  bytes and returns a pointer to the allocated
       memory.  The memory is not  cleared.   If  size  is  0,  then  malloc()
       returns  either  NULL, or a unique pointer value that can later be suc‐
       cessfully passed to free().
Не путай malloc с new из C++.
У тебя url - это указатель на char. sizeof(char*) == sizeof(void*) и для 32-х битных систем == 4. strlen определяет размер строки, находящуюся в памяти, начиная с ячейки, на которую указывает указатель.

Это сообщение отредактировал(а) bsa - 8.8.2008, 10:37
PM   Вверх
Verus
Дата 8.8.2008, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 5.8.2008

Репутация: нет
Всего: нет



Выделяет кол-ом байт, понятно. Тогда как правильно выделять память если я хочу скопировать часть строки url в tmp[0]?
Код

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(sizeof(url));
        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);


    return tmp;
}

при выполнении этого кода в tmp[0] в конце строки дописывается какой-то мусор

Это сообщение отредактировал(а) Verus - 8.8.2008, 11:01
PM MAIL   Вверх
Lycifer
Дата 8.8.2008, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 144
Регистрация: 4.11.2007

Репутация: нет
Всего: нет



int int_pos = (int) (pos-url); что ты здесь получеш?
А так же /0 -конец - строки
PM MAIL ICQ   Вверх
Verus
Дата 8.8.2008, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 5.8.2008

Репутация: нет
Всего: нет



Цитата(Lycifer @ 8.8.2008,  12:32)
int int_pos = (int) (pos-url); что ты здесь получеш?
А так же /0 -конец - строки

Получаю позицию на которой находится символ "|"
PM MAIL   Вверх
bsa
Дата 8.8.2008, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Verus
память под строки надо выделять на 1 символ больше - он нужен для идентификатора конца строки (символ '\0').
Строки копировать удобнее не memcpy(), а strcpy(), которая копирует и этот идентификатор.
PM   Вверх
Verus
Дата 8.8.2008, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 5.8.2008

Репутация: нет
Всего: нет



Цитата(bsa @ 8.8.2008,  12:46)
Verus
память под строки надо выделять на 1 символ больше - он нужен для идентификатора конца строки (символ '\0').
Строки копировать удобнее не memcpy(), а strcpy(), которая копирует и этот идентификатор.

strcpy(); скопирует всю строку, а мне надо только часть, поэтому я в memcpy() указываю сколько нужно скопировать. Копируется столько сколько мне надо, но почему то в конец еще что-то дописывается, разные символы.
Пробовал выделять память и так tmp[0] = (char*)malloc(sizeof(url)); и так tmp[0] = (char*)malloc(strlen(url)); - так получается не то. Вот я и спрашиваю как правильно выделять надо память?
PM MAIL   Вверх
bsa
Дата 8.8.2008, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Verus, в конец ничего не дописывается. там просто "мусор". Ты должен сам вручную поставить символ конца строки. Например, так:
Код
memcpy(tmp[0], url, int_pos);
tmp[0][int_pos] = '\0';

PM   Вверх
Verus
Дата 8.8.2008, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 5.8.2008

Репутация: нет
Всего: нет



Цитата(bsa @ 8.8.2008,  13:18)
Verus, в конец ничего не дописывается. там просто "мусор". Ты должен сам вручную поставить символ конца строки. Например, так:
Код
memcpy(tmp[0], url, int_pos);
tmp[0][int_pos] = '\0';

Спасибо большое.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1345 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.