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) варианте?
|
|
|
Записан
|
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
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 - не является указателем, хотя принимается как указатель в качестве параметра. > Это я совсем не понял (((
|
|
|
Записан
|
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
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 []; Это обязательно надо помнить.>
А чем оно на самом деле является? Что это на самом деле?
Заранее благодарен.
|
|
|
Записан
|
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #5 : 12-01-2004 12:48 » |
|
При работе с указателем ты не можешь использоватьбинарные операции. Тут все зависит от задачи. Когда ты обращаешься к первому элементу массива - то результатом обращения будет его размер - его содержимое, при указателе, адрес и его размер и т.д.
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
Guet
Гость
|
|
« Ответ #6 : 12-01-2004 13:35 » |
|
СПАСИБ ОГРОМНОЕ - ваш форум самый лучший!!!
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
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
Технический
Администратор
Online
Пол:
|
|
« Ответ #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
Молодой специалист
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
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #10 : 15-01-2004 10:24 » |
|
Всё правильно const для этого и существует, но насчёт вот этого: но так писать не следует потому как это в корне не верно!!! это следует писать так....
Я бы воздержался от таких категоричных заявлений. 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.
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #13 : 15-01-2004 14:10 » |
|
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 » |
|
дело в том что хотя стандарт и позволяет записть следующего содержания... char * buffer = "bububububububu"; но так писать не следует потому как это в корне не верно!!! это следует писать так.... :!: const :!: char * buffer = "bububububububu"; ... так что стандарт стандартом ,но надо следовать логике(обязательно опираясь на стандарт ) Логика в том, что такое поведение(неявно преобразование строкового литерала к 'char*') оставлено в целях совместимости с С и будет запрещено в следующей версии стандарта.
|
|
|
Записан
|
|
|
|
lapulya
Молодой специалист
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
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #16 : 19-01-2004 09:20 » |
|
Джон Гмммм.... я не очень понял что вы этим хотите сказать
Просто я хочу использовать указатель дальше. А начальное значение мне больше не нужно. Если я определю его как 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."
|
|
|
lapulya
Молодой специалист
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
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #18 : 19-01-2004 14:41 » |
|
ВНИМАНИЕ! ПРИМЕР ИСПРАВЛЕН 21.01.04. Всё ниже сказаное имело место до этого момента. Последняя строчка примера, первоначально содержала только delete [] buffer; что конечно же являлось грубейшей ошибкой из-за не определённого состояния указателя. Приношу свои извинения и благодарность Доброжелателю. Оригинальное сообщение: Джон позвольте с вами не согласиться...
Конечно позволю. Колхоз - дело добровольное. не очень понятно почему надо исапользовать именно этотже поинтер (создание поинтера на стеке просто бесплатная операция)
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++ »
|
Записан
|
|
|
|
Джон
просто
Администратор
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...
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #24 : 20-01-2004 14:33 » |
|
Ошибка твоя в том, что указатель в конце твоего примера непонятно на что указывает, то ли на динамическую память, то ли на строку в сегменте данных, а это, согласись, грубейшая ошибка.
Согласен! 100% ты прав. Теперь я понял, что ты имеешь ввиду. Сорри, что сразу не допёр :oops: . А "грабли" в твоём ответе действительно не увидел. Конечно же delete нельзя вызывать если if не прокатило. Вот блин нехватка времени к чему приводит. Просто это было "расширение" примера. Там было без delete. Просто первое, что в голову пришло. Потом последовали "советы", ну и дополнил. Но видимо я new увидел и решил, что освободить тоже надо, чтоб не придирались, а вишь - наоборот вышло . Я концентрировался на основной проблеме, а про каноны не подумал. Конечно пример в данном случае действительно корявый. Исправлю в самое ближайшее время. Арифметический if это конструкция logical-or-expression ? expression : conditional-expression так же иначе называемая, тернарной операцией.
Я не про это. Эт ясно. Я уж подумал, что ты весь блок if{} в sprintf засунуть можешь. Ничего страшного, иногда полезно получить резкий ответ, на не менее резкое замечание Это хорошо, что ты не обидчивый, несмотря на то, что я был неправ! Зарегился бы?
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "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."
|
|
|
Джон
просто
Администратор
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
Молодой специалист
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
Молодой специалист
Offline
|
|
« Ответ #27 : 21-01-2004 16:37 » |
|
прошу прощения ... за это первое будет в памяти, до тех пор пока прога не закончится, а второе только до тех пор пока мы не сделаем вот это delete []buffer (если не произойдет утечки памяти)
счего это решил (сам понять не могу) что это глобальная переменная ... наверное на работе перегрелся
|
|
|
Записан
|
С уважением Lapulya
|
|
|
|