Невозможно заставить fgets() и strcat() вести себя желаемым образом

#include "stdio.h"
#include "stdlib.h"
#include "string.h"

int main(){
    char storage[128]="\0";
    char buffer[24];
    fgets(buffer, 24, stdin);
    strcat(storage, buffer);
    fgets(buffer, 24, stdin);
    strcat(storage, buffer);
    printf("%s", storage); // line 12
    return 0;
    }

Я пытаюсь увидеть, что line 12 печатает "string one\0string two", когда я ввожу "string one" и "string two" в предыдущих fgets() строках, но вместо этого печатает "string one\nstring two". Насколько я знаю, strcat() завершает "\0" в конце первой строки, поэтому этот код должен был дать мне формат, который я хотел, но это не так. Что я делаю не так?


person Deniz    schedule 26.11.2015    source источник
comment
char storage[128]="\0"; --› char storage[128]=""; конец строки будет добавлен компилятором.   -  person Weather Vane    schedule 26.11.2015
comment
@WeatherVane Я обновил свой код так, как вы предложили, и у меня все еще такое же поведение.   -  person Deniz    schedule 26.11.2015
comment
Вы имеете в виду, что он по-прежнему печатает "string one\0string two" после внесения предложенного мной изменения? Обратите внимание, что fgets() сохраняет newline в конце, это то, что вы видите?   -  person Weather Vane    schedule 26.11.2015
comment
@WeatherVane Я хочу "string one\0string two", но это дает мне "string one\nstring two". Итак, после того, как я внес предложенное вами изменение, оно по-прежнему давало мне "string one\nstring two". По крайней мере, это то, что я вижу на экране, в основном первая строка напечатана в одной строке, а вторая строка находится в следующей строке, как если бы между ними было "\n".   -  person Deniz    schedule 26.11.2015
comment
Вы можете удалить конечную новую строку, сохраненную fgets(), следующим образом: это безопасно, даже если новой строки нет. buffer [ strcspn(buffer, "\r\n") ] = 0; Однако вы получите "string onestring two", а не "string one\0string two".   -  person Weather Vane    schedule 26.11.2015
comment
@WeatherVane Спасибо за совет. Я планировал использовать buffer[strlen(buffer)-1]=0;, но не уверен, какой из них будет работать лучше. Я попробую оба способа. Дополнение: только что обнаружил, что strlen() не работает, когда входная строка полностью заполняет буфер. Так что, думаю, я пойду с strcspn(). Спасибо.   -  person Deniz    schedule 26.11.2015


Ответы (1)


Результат "string one\nstring two" правильный, потому что новая строка читается fgets. Вы вводите новую строку, когда нажимаете клавишу ввода, чтобы завершить ввод.

Символ новой строки заставляет fgets прекратить чтение, но функция считает его допустимым символом и включает в строку, скопированную в str.

person this    schedule 26.11.2015