запрос относительно перевода строки и fgets()

Код 1:-

int main()
{
    char str[200];
    fgets(str,200,stdin);
    printf("%s",str);
    return 0;
}

Выход:-

ab cd
ab cd
(line feed)

Код 2:-

int main()
{
    char str[200];
    gets(str);
    printf("%s",str);
    return 0;
}

Выход:-

ab cd
ab cd

Когда я ввожу ab(space)cd(enter key) , то в случае fgets() я получаю line feed на выходе, тогда как в случае gets() перевод новой строки не отображается.
В чем дело line feed в этом случае.


person kevin gomes    schedule 02.03.2014    source источник
comment
The newline, if any, is retained. человек fgets   -  person Sakthi Kumar    schedule 02.03.2014
comment
@SakthiKumar: если новая строка сохраняется в случае fgets, то в коде 1 должно быть два перевода строки, один для ввода, другой для вывода, но есть только один   -  person kevin gomes    schedule 02.03.2014
comment
printf("%s",str);. я думаю, в выводе нет лишних \n   -  person Sakthi Kumar    schedule 02.03.2014


Ответы (1)


gets() и fgets() читать FILE в предоставленном буфере, пока не будет обнаружена новая строка. Первый хранит NUL вместо новой строки, второй помещает NUL после новой строки.

Обратите внимание, что gets() небезопасен, поскольку он не предоставляет никакого способа защитить запись за пределы переданного буфера.

fgets() принимает размер буфера и прекращает чтение, если этот размер достигнут. В последнем случае чтение может быть остановлено до того, как будет прочитана любая новая строка.

Для общего метода измельчения различных типов новых строк в конце буфера вы можете взглянуть на этот ответ: https://stackoverflow.com/a/16000784/694576

person alk    schedule 02.03.2014
comment
Я слышал, что gets губителен для использования, но в данном случае fgets губителен, тогда есть ли альтернатива gets и fgets - person kevin gomes; 02.03.2014
comment
Я прошу альтернативу, потому что в моем случае мне не нужна новая строка перед nul - person kevin gomes; 02.03.2014
comment
@kevingomes: Пожалуйста, посмотрите мой еще более обновленный ответ. - person alk; 02.03.2014
comment
еще одна вещь, которую я хочу знать, почему в случае fgets я получаю только один line-feed на выходе, должно быть два перевода строки, один для ввода и другой для вывода - person kevin gomes; 02.03.2014
comment
@kevingomes: вы вводите один, вы получаете один. На самом деле их два, так как подсказка две новой строки ниже последней d. Один после d и один создает пустую строку, то есть перед подсказкой командной строки. - person alk; 02.03.2014
comment
Я не понял твоего последнего объяснения - person kevin gomes; 02.03.2014
comment
one following d означает - person kevin gomes; 02.03.2014
comment
После ab cd есть одна новая строка. И еще один, следующий за последним, производящий пустую строку. - person alk; 02.03.2014
comment
новая строка должна быть ниже d, как это может быть после d - person kevin gomes; 02.03.2014
comment
Символ новой строки невидим, вы просто замечаете его, когда курсор помещается на новую строку. Все, что следует за символом новой строки, записывается с новой строки. - person alk; 02.03.2014