Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: strtok() - нужна помощь...  (Прочитано 16073 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Guet
Гость
« : 12-01-2004 08:45 » 

Помогите разобраться пожалуйста. Мне необходима ф-ция strtok(). Пишу так:
1)
char* str = “123d45”;
char* res = strtok(str, “d”); - run-time ошибка
_______________________________________________________________

2)
char str[] = “123d45”;
char* res = strtok(str, “d”); - OK!

Прототип strtok():
char* strtok(char*, const char*);

Почему в варианте 1) возникает ошибка?
В чём разница между инициализацией переменной str в 1) варианте и в 2) варианте?
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #1 : 12-01-2004 08:58 » 

Потому , что используя первый вариант ты фактически не выделяешь память под укаатель присваевая ему значение первого символа набитой строки.
Сама строка содержится как константа и может не восприниматься в рантайме как нормальная строка.
Во втором случае - ты берешь не указатель , а именно первый элемент нормального массива.

Это распространенная ошибка.

Скажем char [] = "aaa";
aaa - не является указателем, хотя принимается как указатель в качестве параметра.

Для того, что бы все заработало, пиши так:

char* str = new char [100];
strcpy(str, “123d45”,strlen("123d45"));
char* res = strtok(str, “d”); - run-time ошибка

Должно работать.
Записан

А птичку нашу прошу не обижать!!!
Guet
Гость
« Ответ #2 : 12-01-2004 09:36 » 

<Во втором случае - ты берешь не указатель , а именно первый элемент нормального массива.>

char* res = strtok(str, “d”); - OK!

- Я думал, что здесь я беру не <первый  элемент нормального массива> а указатель на первый элемент нормального массива, т.е str = &str[0].

< Сама строка содержится как константа и может не восприниматься в рантайме как нормальная строка.>
Т.е Вы хотите сказать, что память под строку память не выделяется, или под указатель на строку память не выделяется… здесь мне не понятно (((
Поясните пожалуйста подробней, что на самом деле происходит при объявлении:
char* str = “123d45”;

< Скажем char [] = "aaa";
aaa - не является указателем, хотя принимается как указатель в качестве параметра. >
Это я совсем не понял (((
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #3 : 12-01-2004 11:04 » 

Цитата


- Я думал, что здесь я беру не <первый элемент нормального массива> а указатель на первый элемент нормального массива, т.е str = &str[0].


Описка - надо читать в первом случае - ты берешь элемент - прошу простить.
Цитата

Т.е Вы хотите сказать, что память под строку память не выделяется, или под указатель на строку память не выделяется… здесь мне не понятно (((
Поясните пожалуйста подробней, что на самом деле происходит при объявлении:
char* str = “123d45”;


На деле память конечно не выделяется. Вернее - она выделяется но не там где надо. Это и может быть причиной ошибки.
Насколько мне помнится все константные переменные содержаться вместе с кодом программы, а они естественно не могут быть изменены.
Поэтому обращаясь к памяти кода ты получаешь ошибку.

Цитата

aaa - не является указателем, хотя принимается как указатель в качестве параметра. >
Это я совсем не понял (((

Тут все просто.
Строка представлена как массив данных.
Выделяя не указателем а массивом место под нее, ты можешь передать имя переменной ааа как параметр в функция принимающую указатель типа char *

Func ( char * param);

вызов
Func(aaa);
И это будет правильно - но передаешь реально ты в функцию просто первый элемент массива - вернее его адрес, так как он совпадает с адресом на весь массив - то ошибки не происходит.

Однако реально ааа - не является указателем в случае объявления его как char [];
Это обязательно надо помнить.
Записан

А птичку нашу прошу не обижать!!!
Guet
Гость
« Ответ #4 : 12-01-2004 12:22 » 

Понял, спасибо... Последний момент: Вы говорите:
< Однако реально ааа - не является указателем в случае объявления его как char [];
Это обязательно надо помнить.>

 А чем оно на самом деле является? Что это на самом деле?

Заранее благодарен.
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #5 : 12-01-2004 12:48 » 

При работе с указателем ты не можешь использоватьбинарные операции.
Тут все зависит от задачи.
Когда ты обращаешься к первому элементу массива - то результатом обращения будет его размер - его содержимое, при указателе, адрес и его размер и т.д.
Записан

А птичку нашу прошу не обижать!!!
Guet
Гость
« Ответ #6 : 12-01-2004 13:35 » 

СПАСИБ ОГРОМНОЕ - ваш форум самый лучший!!!
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #7 : 12-01-2004 14:40 » 

Guet, Причина ошибки кроется в свойстве strtok, которая заменяет найденный token нулём!!! Чего ессно нельзя делать в константных строках, каковой и является char* str = “123d45”;
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 13-01-2004 18:36 » 

Я тоже как-то столкнулся с такой проблемой. Решил ее предварительным созданием копии строки.

http://www.linuxdoc.ru/manpages/man3/strtok.3.html
Код:
НАЙДЕННЫЕ ОШИБКИ
       Никогда  не  используйте  эти  функции.   Если Вы все-таки
       делаете это, то имейте в виду:

              Эти функции изменяют свой первый аргумент.

              Эти  функции  нельзя  использовать  со   строковыми
              константами.

              Информация о символах-разделителях теряется.

              Функция  strtok()  использует статический буфер при
              обработке   строки,    поэтому    её    небезопасно
              использовать  в программах со множеством процессов,
              работающих  с  одной  областью  памяти.  Если   Вам
              подходит strtok_r(), то используйте эту функцию.
В стандарте же об этом я не нашел.
http://www.opengroup.org/onlinepubs/007904975/functions/strtok.html
« Последнее редактирование: 23-11-2007 18:29 от Алексей1153++ » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #9 : 15-01-2004 09:36 » 

дело в том что хотя стандарт и позволяет записть следующего содержания...

char * buffer = "bububububububu";

но так писать не следует потому как это в корне не верно!!! это следует писать так....

 :!: const :!:  char * buffer = "bububububububu";

и теперь исходный код просто не скомпилился бы
Цитата

char* str = “123d45”;
char* res = strtok(str, “d”); - run-time ошибка


и ошибка выползла бы на стадии компиляции!!! так что стандарт стандартом ,но надо следовать логике(обязательно опираясь на стандарт Жжешь  Жжешь  Жжешь )
Записан

С уважением Lapulya
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #10 : 15-01-2004 10:24 » 

Всё правильно const для этого и существует, но насчёт вот этого:

Цитата: lapulya
но так писать не следует потому как это в корне не верно!!! это следует писать так....

Я бы воздержался от таких категоричных заявлений.

Код:
char * buffer = "bububububububu";
printf("Start buffer %s",buffer);
buffer = new char[256];
ReadDataToBuf(buffer,256);
strtok(buffer, pszDelim);
« Последнее редактирование: 23-11-2007 18:34 от Алексей1153++ » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Igor10
Гость
« Ответ #11 : 15-01-2004 12:47 » 

Цитата

char * buffer = "bububububububu";
printf("Start buffer %s",buffer);
buffer = new char[256];
ReadDataToBuf(buffer,256);
strtok(buffer, pszDelim);


I kak obratitsa k "bububububububu" ?
2-e videlenie pamiati...
 esli uj...

char * buffer = new char[256];
strcpy( buffer, "bububububububu" );
printf("Start buffer %s",buffer);
ReadDataToBuf(buffer,256);
strtok(buffer, pszDelim);
Записан
Igor10
Гость
« Ответ #12 : 15-01-2004 12:54 » 

Guet.
Esli nado odnorazovoie vhojdenie - polsusia strchr, strrchr( s kontsa ). Dlia strtok delai kopiu ishodnogo stringa.
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #13 : 15-01-2004 14:10 » 

Цитата: Igor10

I kak obratitsa k "bububububububu" ?


А оно и не нужно. Речь идёт об определении указателя как const.
Я инициаллизирую указатель с константной строкой, а потом использую его как указатель на объект в куче. И передаю его в качестве параметра в strtok.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
NetRaider
Гость
« Ответ #14 : 17-01-2004 03:17 » 

Цитата: lapulya
дело в том что хотя стандарт и позволяет записть следующего содержания...

char * buffer = "bububububububu";

но так писать не следует потому как это в корне не верно!!! это следует писать так....

 :!: const :!:  char * buffer = "bububububububu";

...

 так что стандарт стандартом ,но надо следовать логике(обязательно опираясь на стандарт Жжешь  Жжешь  Жжешь )


Логика в том, что такое поведение(неявно преобразование строкового литерала к 'char*') оставлено в целях совместимости с С и будет запрещено в следующей версии стандарта.
Записан
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #15 : 19-01-2004 08:59 » 

NetRaider абсолютно прав (собственно это я и мел ввиду)
Цитата

оставлено в целях совместимости с С

 

Igor10 это
Цитата

char * buffer = "bububububububu";

 
и это
char * buffer = new char[256];
Цитата

strcpy( buffer, "bububububububu" );

 
абсолютно разные вещи

первое будет в памяти, до тех пор пока прога не закончится, а второе только до тех пор пока мы не сделаем вот это delete []buffer (если не произойдет утечки памяти)

Джон Гмммм.... я не очень понял что вы этим хотите сказать
Цитата

char * buffer = "bububububububu";
printf("Start buffer %s",buffer);
buffer = new char[256];
ReadDataToBuf(buffer,256);
strtok(buffer, pszDelim);
Записан

С уважением Lapulya
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #16 : 19-01-2004 09:20 » 

Цитата: lapulya

Джон Гмммм.... я не очень понял что вы этим хотите сказать


Просто я хочу использовать указатель дальше. А начальное значение мне больше не нужно. Если я определю его как const, то я не смогу его использовать в strtok(). Это было про категоричность высказывания

Цитата: lapulya

но так писать не следует потому как это в корне не верно!!! это следует писать так....


я привёл пример,  в котором имеет смысл писать ИМЕННО так. Ага
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #17 : 19-01-2004 13:31 » 

Джон позвольте с вами не согласиться...
Цитата

char * buffer = "bububububububu";
printf("Start buffer %s",buffer);
buffer = new char[256];
ReadDataToBuf(buffer,256);
strtok(buffer, pszDelim);

не очень понятно почему надо исапользовать именно этотже поинтер (создание поинтера на стеке просто бесплатная операция) можно написать так

const char * buffer = "bububububububu";
printf("Start buffer %s",buffer);

char * newBuffer = new char[256];
ReadDataToBuf(newBuffer,256);
strtok(newBuffer, pszDelim);

, да не в этом суть!!!

допустим вы пишете следующее
char * buffer = "bubuubububu";
и далее
void f(char *);
....
int main()
{
   f(buffer);
}

где
void f(char *)
{
   *buffer = '\0';  // или любое другое ИЗМЕНЕНИЕ КОНСТАНТНОЙ СТРОКИ!!!
}

как же так !!! спросит пользователь  Жаль  была константная строка "bubuubububu", а это бла моя ЛЮБИМАЯ строка, а теперь ее нет (или она не такая)Не понял а если это был UUID COM обекта... :twisted:  :twisted:  :twisted:
Записан

С уважением Lapulya
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #18 : 19-01-2004 14:41 » 

ВНИМАНИЕ! ПРИМЕР ИСПРАВЛЕН 21.01.04. Всё ниже сказаное имело место до этого момента.
Последняя строчка примера, первоначально содержала только
delete [] buffer; что конечно же являлось грубейшей ошибкой из-за не определённого состояния указателя. Приношу свои извинения и благодарность Доброжелателю.

Оригинальное сообщение:

Цитата: lapulya
Джон позвольте с вами не согласиться...

Конечно позволю. Колхоз - дело добровольное. Ага

Цитата: lapulya
не очень понятно почему надо исапользовать именно этотже поинтер (создание поинтера на стеке просто бесплатная операция)

lapulya,  А вообще всё на стеке бесплатно. И места на экране навалом, и в сотнях страниц текста разбираться - времени навалом, и переменных можно наобъявлять пруд-пруди. Это что аргументы? Я шокирован!

Не надо искать решений для моего примера, а уж тем более выдумывать ситуации, когда он не будет работать. Это ещё не доказательство утверждения "в корне неверно!!!". А потом, не всё-ли равно бедному пользователю, как я для него строку сохраню?

Если нужен ТОЛЬКО const указатель и програмер хочет себя обезопасить от невольных изменений тогда - ДА. Можно и нужно писать const char *p.  Я нигде противоположного не утверждал.

А если я НЕ ХОЧУ использовать другой (ещё один указатель)? Мне одного достаточно! И начальные данные мне не нужны? Что в этом "в корне не верного"? А?

Ну, и раз уж нужна прецизионная логика, то уточню пример:

Код:
char * buffer = "Даных не поступало";
if(!m_lstDataStream->IsEmpty())
{
       buffer = new char[256];
       m_lstDataStream->ReadDataToBuf(buffer,256);
       buffer = strtok(buffer, ":");
}
printf("Состояние парсера : %s",buffer);
if(!m_lstDataStream->IsEmpty()) delete [] buffer;

Зачем мне ещё один указатель? Какая в нём необходимость?  Ага
А если я что-то отлаживаю и использую тысячи sprintf() и указатели на char с начальным значением, мне что, для каждго тоже свой "бесплатный"  указатель дополнительно объявлять? :twisted:  :twisted:  :twisted:

Ну и наконец последнее:

const char * buffer = "bububububububu";
buffer = new char[256];

компилятором пропускается, и как в таком случае сохранить начальную строку? Бедный пользователь, ему и const не помогло! Ага
« Последнее редактирование: 23-11-2007 18:39 от Алексей1153++ » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Доброжелатель
Гость
« Ответ #19 : 19-01-2004 20:00 » 

Код:
char * buffer = "Даных не поступало";
if(!m_lstDataStream->IsEmpty())
{
       buffer = new char[256];
       m_lstDataStream->ReadDataToBuf(buffer,256);
       buffer = strtok(buffer, ":");
}
printf("Состояние парсера : %s",buffer);
delete [] buffer; // грабля

Зачем мне ещё один указатель? Какая в нём необходимость?  Ага
А если я что-то отлаживаю и использую тысячи sprintf() и указатели на char с начальным значением, мне что, для каждго тоже свой "бесплатный"  указатель дополнительно объявлять? :twisted:  :twisted:  :twisted:

В данном примере лучше было - бы указатель инициализировать 0, а в функции printf использовать арифметический if - (expr) ? t : f
Дабы не вводить в заблуждение форумян, такие корявые примеры лучше не приводить.

Ну и наконец последнее:

const char * buffer = "bububububububu";
buffer = new char[256];

компилятором пропускается, и как в таком случае сохранить начальную строку? Бедный пользователь, ему и const не помогло! Ага


С точки зрения стандарта - верная конструкция.
const char * - указатель на константу типа char
char *const - константный указатель на char
как говорится, почувствуйте разницу.
« Последнее редактирование: 23-11-2007 18:40 от Алексей1153++ » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #20 : 20-01-2004 09:17 » 

Доброжелатель,  Не такой уж ты и доброжелатель, как я посмотрю. Ага

Ты хоть понял о чём речь идёт? По-моему нет. Тогда объясню. Вообщето правильней будет если ты будешь читать ВСЕ сообщения, а не только одно, на твой вкус.

Речь идёт о высказывании lapulya,  "так писать не следует потому как это в корне не верно!!! это следует писать так...."

Я привёл пример, в котором указатель инициаллизируется с константной строкой:

char * buffer = "Даных не поступало";

И, кстати, почему я должен иннициаллизировать его 0  Я шокирован!  Я шокирован!  :?:  Не можешь поподробней объяснить в чём ошибка? А если мне нужна начальная строка?

А дальше в зависимости от ситуации - использую либо его первоначальное значение, либо первый элемент из потока данных перед разделителем. Если бы указатель был объявлен с const, то компилятор не пропустил бы strtok().

Цитата: Доброжелатель
в функции printf использовать арифметический if - (expr) ? t : f
Дабы не вводить в заблуждение форумян, такие корявые примеры лучше не приводить.


Не мог бы ты привести код для данного примера с " (expr) ? t : f "
Очень интересно на него взглянуть. Как будет реализован блок if{} в printf?

Да и что в примере корявого? А в заблуждение скорее вводят такие бесполезные комментарии, которые к теме никакого отношения не имеют:

Цитата: Доброжелатель

const char * - указатель на константу типа char
char *const - константный указатель на char
как говорится, почувствуйте разницу.


Кто бы мог подумать! Ага

зы Сорри если был резок - времени в обрез.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Igor10
Гость
« Ответ #21 : 20-01-2004 11:47 » 

Lapulya:
Цитата

Igor10 это
Цитата:

char * buffer = "bububububububu";



и это
char * buffer = new char[256];
Цитата:

strcpy( buffer, "bububububububu" );



абсолютно разные вещи

первое будет в памяти, до тех пор пока прога не закончится, а второе только до тех пор пока мы не сделаем вот это delete []buffer (если не произойдет утечки памяти)


Ne verno:
1-e - do vihoda peremennoi "buffer" is oblasti vidimosti ( tut - konets function )
2-e - do "delete []buffer" ili konets process ( exe ).
No rech bila ne ob etom.
Записан
Anonymous
Гость
« Ответ #22 : 20-01-2004 12:32 » 

Цитата: Джон
Доброжелатель,  Не такой уж ты и доброжелатель, как я посмотрю. Ага
А это смотря с какой стороны смотреть. Ага

Цитата: Джон
Ты хоть понял о чём речь идёт? По-моему нет. Тогда объясню. Вообщето правильней будет если ты будешь читать ВСЕ сообщения, а не только одно, на твой вкус.
Я сделал всё правильно, всмысле прочитал весь тред.

Цитата: Джон
Речь идёт о высказывании lapulya,  "так писать не следует потому как это в корне не верно!!! это следует писать так...."

Я привёл пример, в котором указатель инициаллизируется с константной строкой:

char * buffer = "Даных не поступало";

И, кстати, почему я должен иннициаллизировать его 0  Я шокирован!  Я шокирован!  :?:  Не можешь поподробней объяснить в чём ошибка? А если мне нужна начальная строка?
Ошибка твоя в том, что указатель в конце твоего примера непонятно на что указывает, то ли на динамическую память, то ли на строку в сегменте данных, а это, согласись, грубейшая ошибка.
Кстати, в твоем примере я попытался выделить опасное место ( // грабля), но текст не получилось выделить жирным шрифтом.  Так больше нельзя...

А вот и пожелание Грому - хотелось бы в тегах [ code ][ /code ] выделять текст жирным, курсивом ...

Цитата: Джон
А дальше в зависимости от ситуации - использую либо его первоначальное значение, либо первый элемент из потока данных перед разделителем. Если бы указатель был объявлен с const, то компилятор не пропустил бы strtok().

Цитата: Доброжелатель
в функции printf использовать арифметический if - (expr) ? t : f
Дабы не вводить в заблуждение форумян, такие корявые примеры лучше не приводить.

Не мог бы ты привести код для данного примера с " (expr) ? t : f "
Очень интересно на него взглянуть. Как будет реализован блок if{} в printf?
Арифметический if это конструкция
logical-or-expression ? expression : conditional-expression
так же иначе называемая, тернарной операцией.

Тогда код будет следующим:

Код:
char * buffer = 0;
if(!m_lstDataStream->IsEmpty())
{
       buffer = new char[256];
       m_lstDataStream->ReadDataToBuf(buffer,256);
       buffer = strtok(buffer, ":");
}
printf("Состояние парсера : %s", (buffer) ? bufer : "Даных не поступало");
delete [] buffer;

Цитата: Джон
Да и что в примере корявого?

У человека и так "каша" в голове, а тут еще такие примеры. Такими примерами мы можем только усугубить ситуацию.

Цитата: Джон
А в заблуждение скорее вводят такие бесполезные комментарии, которые к теме никакого отношения не имеют:

Цитата: Доброжелатель
const char * - указатель на константу типа char
char *const - константный указатель на char
как говорится, почувствуйте разницу.

Кто бы мог подумать! Ага
Да возможно здесь я был излишне придирчив.


Цитата: Джон
зы Сорри если был резок - времени в обрез.

Ничего страшного, иногда полезно получить резкий ответ, на не менее резкое замечание Ага
« Последнее редактирование: 23-11-2007 18:42 от Алексей1153++ » Записан
Igor10
Гость
« Ответ #23 : 20-01-2004 13:25 » 

To John:
Цитата




Igor10 писал(а):

I kak obratitsa k "bububububububu" ?



А оно и не нужно. Речь идёт об определении указателя как const.
Я инициаллизирую указатель с константной строкой, а потом использую его как указатель на объект в куче. И передаю его в качестве параметра в strtok.


Pravilno, i poluchaesh svoi bagi:
Цитата

Ну, и раз уж нужна прецизионная логика, то уточню пример:

Код:

char * buffer = "Даных не поступало";
if(!m_lstDataStream->IsEmpty())
{
       buffer = new char[256];
       m_lstDataStream->ReadDataToBuf(buffer,256);
       buffer = strtok(buffer, ":");
}
printf("Состояние парсера : %s",buffer);
delete [] buffer;


delete []buffer; !!!!!
fig ti znaesh kakoi poiter - ni obnulit', ni udalit'...Ili heap, ili const... Tret'ego ne dano...
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #24 : 20-01-2004 14:33 » 

Цитата: Anonymous

Ошибка твоя в том, что указатель в конце твоего примера непонятно на что указывает, то ли на динамическую память, то ли на строку в сегменте данных, а это, согласись, грубейшая ошибка.


Согласен! 100% ты прав. Теперь я понял, что ты имеешь ввиду. Сорри, что сразу не допёр :oops: . А "грабли" в твоём ответе действительно не увидел.  Так больше нельзя...

Конечно же delete нельзя вызывать если if не прокатило. Вот блин нехватка времени к чему приводит. Просто это было "расширение" примера. Там было без delete. Просто первое, что в голову пришло. Потом последовали "советы", ну и дополнил. Но видимо я new увидел и решил, что освободить тоже надо, чтоб не придирались, а вишь - наоборот вышло Ага . Я концентрировался на основной проблеме, а про каноны не подумал. Конечно пример в данном случае действительно корявый. Исправлю в самое ближайшее время.

Цитата: Anonymous

Арифметический if это конструкция
logical-or-expression ? expression : conditional-expression
так же иначе называемая, тернарной операцией.


Я не про это. Эт ясно. Я уж подумал, что ты весь блок if{}  в sprintf засунуть можешь.  Ага

Цитата: Anonymous

Ничего страшного, иногда полезно получить резкий ответ, на не менее резкое замечание Ага


Это хорошо, что ты не обидчивый, несмотря на то, что я был неправ!
Зарегился бы?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #25 : 20-01-2004 14:36 » 

Igor10,  Всё пучком - уже разобрался. Читай мой ответ Доброжелателю.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #26 : 21-01-2004 16:28 » 

Джону... (и не в обиду .. не надо так напрыгивать это просто дискуссия) который писал
Цитата

Ну и наконец последнее:

const char * buffer = "bububububububu";
buffer = new char[256];

компилятором пропускается, и как в таком случае сохранить начальную строку? Бедный пользователь, ему и const не помогло!


а что теперь с этим buffer делать то!!! (ну разьве что delete []buffer) Ага
более того... я не говорил что компилятор не пропустит это
Цитата

const char * buffer = "bububububububu";
buffer = new char[256];

компилятором пропускается

я лишь сказал что
Цитата

...это следует писать так....

 const  char * buffer = "bububububububu";

и теперь  :!: исходный код :!:  просто не скомпилился бы

а исходный код вот
Цитата

char* str = “123d45”;
char* res = strtok(str, “d”); - run-time ошибка

а на счет этого
Цитата

но так писать не следует потому как это в корне не верно!!! это следует писать так....

хочу сказать следующее, что "bububububbu" это константная строка по определению и ее модифицирование вообще говоря не желательно (как минимум сос тороны компилятора, не говоря уже о пользователях Ага ) и поэтому настоятельно рекомендовано (и это не я придумал, хотя с этим полностью согласен) использовать вот это
Цитата

const char * buffer = "bububububububu";
Записан

С уважением Lapulya
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #27 : 21-01-2004 16:37 » 

прошу прощения ... за это
Цитата

первое будет в памяти, до тех пор пока прога не закончится, а второе только до тех пор пока мы не сделаем вот это delete []buffer (если не произойдет утечки памяти)

счего это решил (сам понять не могу) что это глобальная переменная ... наверное на работе перегрелся
Записан

С уважением Lapulya
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines