как внутренне работает fgets? - PullRequest
5 голосов
/ 22 июня 2011

Ну, это основной вопрос, но я, кажется, достаточно запутался.

#include<stdio.h>
int main()
{
char a[100];
printf("Enter a string\n");
scanf("%s",a);
}

По сути, это то, чего я хочу достичь. Если я введу строку

James Bond

тогда я хочу, чтобы это было сохранено в массиве a. Но проблема в том, что из-за наличия пробела между словами сохраняется только Джеймс. Так как я могу решить это.

UPDATE
После ответов, приведенных ниже, я понимаю, что fgets () будет лучшим выбором. Я хочу знать внутреннюю работу fgets: почему она может хранить строку с пробелом, а scanf не может делать то же самое?

Ответы [ 5 ]

5 голосов
/ 22 июня 2011

Это то, что вам нужно?

Все реализации сканируют входной файл (или поток), пока он не достигнет \ n илиEOF или параметр maxSize ударил ...

1 голос
/ 22 июня 2011

Обычно scanf разрывает ввод в пробелах (пробел, табуляция, перевод строки, ...).

Например, ввод " 5 42 -100" принимается с scanf("%d%d%d")потому что каждый %d лишает ведущих пробелов.То же самое происходит с %s.

Единственными спецификаторами преобразования, где игнорирование начальных пробелов не происходит, являются %%, %[ и %c (и, по разным причинам, %n)

char input[] = " hello world";
char buf[100];
sscanf(input, "%8c", buf); /* buf contains " hello w" */
sscanf(input, "%8[^o]", buf); /* buf contains " hell" */

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


Я использую Базовые спецификации Open Group Issue 7 для онлайн-документации

1 голос
/ 22 июня 2011

scanf читает до первого символа пробела.Решение состоит в том, чтобы использовать fgets, если память мне не изменяет, в вашем случае это будет:

fgets(a, 100, STDIN);

Он будет читать до 100 символов (или первый \ n)из стандартного ввода и сохраните его в.

Никогда не используйте функцию get, даже если она выглядит проще.

0 голосов
/ 22 июня 2011

Попробуйте fgets () :

char a[100];
printf("Enter a string\n");
fgets(a, sizeof(a), STDIN);

Чтобы узнать больше о STDIN, , отметьте .

0 голосов
/ 22 июня 2011

Вы должны использовать gets (a) / fgets (a, sizeof (a), stdin) вместо sscanf ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...