snprintf () читает только до новой строки? - PullRequest
0 голосов
/ 19 мая 2018

Я хотел бы отправить сообщение через сокет, которое выглядит так: «USER anonymous \ r \ n».Чтобы создать отформатированную строку вместо постоянной, я использовал snprintf ().К сожалению, похоже, что он не копирует символ новой строки \n, а только возврат каретки \r.

#define USERNAME_ANONYMOUS "anonymous"
[...]


// Inside a function.
int sz = snprintf(NULL, 0, "USER %s\r\n", USERNAME_ANONYMOUS);
char* username = NULL;
if ((username = calloc(sz + 1, sizeof(char))) == NULL) {
    perror("Could not allocate memory");
    return;
}
snprintf(username, sz, "USER %s\r\n", USERNAME_ANONYMOUS);
for (int i = 0; i <= sz; i++) {
    printf("%c  %d\n", username[i], username[i]);
}

Выход:

U  85
S  83
E  69
R  82
   32
a  97
n  110
o  111
n  110
y  121
m  109
o  111
u  117
s  115
  13
  0
  0

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Ну, если вы выделите буфер размером sz + 1, тогда передайте этот размер буфера во второй вызов snprintf, который равен sz + 1, а не sz, то есть число, которое выpass.

Второй вызов snprintf должен читаться следующим образом:

snprintf(username, sz + 1, "USER %s\r\n", USERNAME_ANONYMOUS);

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

0 голосов
/ 19 мая 2018

С это snprintf (и семейство) ссылка :

Максимум bufsz - 1 символов написано.

Размер выобеспечить должен быть включая терминатор.Вам необходимо использовать sz + 1 для печати полной строки.

...