Как я могу вставить символ новой строки ('\ n'), когда я использую snprintf в C - PullRequest
0 голосов
/ 07 февраля 2020

Я попробовал этот код

void print_formatted(void) {
    char buffer[100];
    char line[15];
    FILE* fp;
    char* message = "Hello World in C language"

    fp = fopen("test.txt","w");
    snprintf(line, 10, "%s\n", message);
    strcpy(buffer, line);
    buffer += 11;

    snprintf(line, 10, "%s\n", message + 10);
    strcpy(buffer, line);
    fwrite(buffer, sizeof(buffer[0]), 20, fp);
}

Ожидаемый результат (test.txt):

Hello World in
C language     

Но реальный результат (test.txt):

Hello World in C language

Вот буферная память:

.
.
[10] = '\0'
[11] = 'C'
[12] = ' '
[13] = 'l'
.
.

Как мне вставить данные '\ n' вместо '\ 0'. И как я могу распечатать отформатированный ..

1 Ответ

3 голосов
/ 07 февраля 2020

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

Здесь:

char* message = "Hello World in C language"
                                           ^
                                           Missing ;

Здесь:

buffer += 11;

error: assignment to expression with array type

В любом случае, ваша проблема - неправильное понимание snprintf

С http://man7.org/linux/man-pages/man3/fprintf.3p.html у нас есть

Функция snprintf () должна быть эквивалентна sprintf (), с добавлением аргумента n, который устанавливает размер буфера, на который ссылается s. Если n равно нулю, ничего не должно быть записано, а s может быть нулевым указателем. В противном случае выходных байтов, выходящих за n ‑ 1, следует отбрасывать вместо записи в массив , а нулевой байт записывается в конце байтов, фактически записанных в массив.

Так что это значит?

Хорошо, предположим, что у вас есть:

char line[15000];
snprintf(line, 10000, "%s\n", message);

В этом случае в буфере назначения достаточно места, поэтому line будет

"Hello World in C language\n"

Это все символы от message плюс '\n' из строки форматирования.

При изменении кода на:

char line[15];
snprintf(line, 10, "%s\n", message);

Вы будете только получите первые 9 символов указанной строки - таким образом, вы получите следующее значение в line:

"Hello Wor"

Таким образом, '\n' был обрезан вместе с частями message.

Есть много способов добавить это '\n' - вот один из них:

char line[15];
int n = snprintf(line, 10, "%s\n", message);
if (n > 9)
{
    line[8] = '\n';
}
else if (n > 0)
{
    line[n-1] = '\n';
}

В вашем случае это приведет к line:

"Hello Wo\n"
...