Парсинг массива char

Datak
Offline
Зарегистрирован: 09.10.2014

rene пишет:



















  char* strbuf = "000000000000000000000000000000"; // резервируем память
  char c = 49;
  *strbuf = 0; // перемещаем указатель на начало строки
  strbuf = "123";
  strncat(strbuf, &c, 1); // добавляем символ "1" к strbuf

Скажите, а такой код может считаться приемлемым? Вроде это позволяет не вводить дополнительных переменных для преобразования char в char* при использовании strtok

Нет, тоже не совсем то. Здесь в памяти создаётся два буфера:
в первый помещается "000000000000000000000000000000", во второй "123".

После этого strncat добавляет ко второму "1", и при этом переполняет его, т. к. в этом втором буфере свободного места не было.

Можно в 4 строку заменить на strcpy( strbuf, "123" ); Тогда, кажется, получите что хотели. Если я правильно помню, как работает strcpy.

А вообще, чтобы легко читалось, я бы как-нибудь так написал:













  char strbuf[50] = ""; // резервируем буфер и записываем в него пустую строку

  char c = 49;
  char* str = "123";

  strcat( strbuf, str );    // если надо добавить строку
  strncat( strbuf, &c, 1 ); // если надо добавить один символ 

Конечно, строку str можно отдельно не создавать, а указать сразу при вызове: strcat( strbuf, "123" );

Если начало строки всегда одинаково, можно вообще не вызывать strcat, а задать это начало при объявлении буфера: char strbuf[50] = "123"; В этом случае будет выделен буфер размером 50 байт, и первые 4 байта будут проинициализированы строкой "123". (4 байта - учитывая завершающий строку ноль).
 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

'0' и '\0' две больших разницы.
Добавляя символ через strncat не забывайте заполнить в конец строки символ '\0', иначе будет лажа, лотерея. Более простой способ, найти указатель на конец строки в буфере, записать туда символ, затем конец строки '\0', тогда будет работать предсказуемо и корректно.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Upd: сдублировалось, удалил.

rene
Offline
Зарегистрирован: 21.01.2014

Спасибо за подробные разьяснения

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

char * strncat ( char * destination, const char * source, size_t num )

Appends the first num characters of source to destination, plus a terminating null-character.

Я так понимаю ничего в конце добавлять не надо, уже всё реализовано, на то она и билиотека и стандартные функции, чтобы не искать указатели на конец строк и ничего не дописыывать вручную.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Penni пишет:

char * strncat ( char * destination, const char * source, size_t num )

Appends the first num characters of source to destination, plus a terminating null-character.

Я так понимаю ничего в конце добавлять не надо, уже всё реализовано, на то она и билиотека и стандартные функции, чтобы не искать указатели на конец строк и ничего не дописыывать вручную.

не всегда... в этой - char * strncpy ( char * destination, const char * source, size_t num ); - надо делать null character manually added,

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Penni пишет:

char * strncat ( char * destination, const char * source, size_t num )

Appends the first num characters of source to destination, plus a terminating null-character.

Я так понимаю ничего в конце добавлять не надо, уже всё реализовано, на то она и билиотека и стандартные функции, чтобы не искать указатели на конец строк и ничего не дописыывать вручную.


Если полностью прочитать описание функции, то можно понять, что если num не позволяет записать символ конца строки, то конец строки не будет записан. Конечно можно пофилософ ствовать на тему, что буферы всегда большие и программисты всегда пишут правильно.
Считайте моё предыдущее сообщение как предупреждение, что нужно обратить внимание на данный момент, иначе поход по граблям достаточно вероятен. :)