заявка относно подаване на ред и 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. man 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
Питам за алтернативата, защото в моя случай не ми трябва нов ред преди нула - 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