jenya7 0 24 ноября, 2022 Опубликовано 24 ноября, 2022 (изменено) · Жалоба Я наверно где то туплю но src_len = strlen(&src[3]); char body[src_len]; memset(body, '\0', sizeof(body)); strncpy(body, &src[3], src_len); int argc = 0; брейк пойнт на int argc = 0; и что я вижу откуда в body мусор в конце строки? не знаю насколько это важно но отладка в симуляторе (Debugger = Simulator). Изменено 24 ноября, 2022 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Shamil 2 24 ноября, 2022 Опубликовано 24 ноября, 2022 · Жалоба В 24.11.2022 в 15:30, jenya7 сказал: Я наверно где то туплю но откуда в body мусор в конце строки? strlen() возвращает длину строки без завершающего нуля. Вот вы и создаете новую строку которая не завершается нулем. И получаете мусор в конце, который обрывается по какому то случайному нулю. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 24 ноября, 2022 Опубликовано 24 ноября, 2022 (изменено) · Жалоба On 11/24/2022 at 1:04 PM, Shamil said: strlen() возвращает длину строки без завершающего нуля. Вот вы и создаете новую строку которая не завершается нулем. И получаете мусор в конце, который обрывается по какому то случайному нулю. после memset строка проинициализирована. вот состояние после memset а strlen - src не имеет никаких других чаров - это видно из окна отладки. Изменено 24 ноября, 2022 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 24 ноября, 2022 Опубликовано 24 ноября, 2022 · Жалоба 2 minutes ago, jenya7 said: после memset строка проинициализирована А смысл в memset, если потом все будет перетерто strncpy? Вы получили массив body с длиной 32 и без \0 в конце. Отображатор показывает больше 32. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 24 ноября, 2022 Опубликовано 24 ноября, 2022 (изменено) · Жалоба On 11/24/2022 at 1:22 PM, aaarrr said: А смысл в memset, если потом все будет перетерто strncpy? Вы получили массив body с длиной 32 и без \0 в конце. Отображатор показывает больше 32. memset я добавил чтоб убрать мусор. почему? так и есть 32 чара (без "for"). Изменено 24 ноября, 2022 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 24 ноября, 2022 Опубликовано 24 ноября, 2022 · Жалоба Quote The strlen() function calculates the length of the string pointed to by s, excluding the terminating null byte ('\0'). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 24 ноября, 2022 Опубликовано 24 ноября, 2022 · Жалоба On 11/24/2022 at 1:34 PM, aaarrr said: ок. меньше не больше. не вижу причину добавления мусора в конце. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 62 24 ноября, 2022 Опубликовано 24 ноября, 2022 · Жалоба On 11/24/2022 at 1:30 PM, jenya7 said: char body[src_len]; А что так можно ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 24 ноября, 2022 Опубликовано 24 ноября, 2022 · Жалоба On 11/24/2022 at 1:38 PM, dimka76 said: А что так можно ? в IAR да. если выставить галку allow VLA. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 24 ноября, 2022 Опубликовано 24 ноября, 2022 · Жалоба 2 minutes ago, jenya7 said: не вижу причину добавления мусора в конце 15 minutes ago, jenya7 said: Вы получили массив body с длиной 32 и без \0 в конце. Отображатор показывает больше 32. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tgruzd 11 24 ноября, 2022 Опубликовано 24 ноября, 2022 · Жалоба 2 минуты назад, jenya7 сказал: ок. меньше не больше. не вижу причину добавления мусора в конце. терминирующий ноль не копирует, вам говорят. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AndyBig 8 24 ноября, 2022 Опубликовано 24 ноября, 2022 · Жалоба Смотрите. У Вас есть строка "abcdef". Вы берете через strlen() ее длину, получаете 6. После этого создаете массив длиной 6 байт, обнуляете его через memset() и копируете в него эту строку длиной 6 байт. Получаете массив длиной 6 байт, занятый шестью символами из скопированной строки. Все, седбмой байт, который должен быть нулем для завершения строки, остается за пределами массива, он не обнуляется в memset() и не копируется из оригинальной строки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tgruzd 11 24 ноября, 2022 Опубликовано 24 ноября, 2022 · Жалоба 3 минуты назад, dimka76 сказал: А что так можно ? а почему бы и нет) память под массив выделится на стэке. static char body[src_len]; уже не прокатит Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 24 ноября, 2022 Опубликовано 24 ноября, 2022 · Жалоба а всё потому что нефиг вымудриваться strcpy(body, &src[3]); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 140 24 ноября, 2022 Опубликовано 24 ноября, 2022 · Жалоба 3 минуты назад, jenya7 сказал: а всё потому что нефиг вымудриваться Вы принципиально не читаете ответы? В вашем массиве должно быть зарезервировано место под признак окончания строки, байт с кодом 0. strcpy() не следит, что ваш массив уже закончился и тупо пишет все, что ей дали на вход. Вы испортили следующую за массивом переменную. Счастливой отладки! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться