Разница между scanf () и fgets () - PullRequest
31 голосов
/ 10 августа 2009

Я хочу знать, в чем разница между fgets() и scanf(). Я использую C в качестве моей платформы.

Ответы [ 6 ]

24 голосов
/ 10 августа 2009

Есть несколько отличий. Два важных из них:

  • fgets() может читать из любого открытого файла, но scanf() читает только стандартный ввод.
  • fgets() читает 'строку текста' из файла; scanf() может использоваться для этого, но также обрабатывает преобразования из строковых в встроенные числовые типы.

Многие люди используют fgets() для чтения строки данных, а затем используют sscanf() для ее анализа.

7 голосов
/ 10 августа 2009
int scanf(const char * restrict format, ...);

scanf (3) ищет определенный шаблон , определенный аргументом формата на заданном входе, известном как stdin , где шаблон определяется вами. Заданный вход для scanf (3) , в зависимости от его варианта (scanf, fscanf, sscanf, vscanf, vsscanf, vfscanf), может быть строкой или файлом.

char *fgets(char * restrict str, int size, FILE * restrict stream);

fgets (3) просто читает строку из входного файла stream и копирует байты в виде нулевой завершающей строки в буфер str и ограничить вывод в буфер заданными байтами в размере .

6 голосов
/ 10 августа 2009

Scanf не выполняет проверку границ. fgets, вероятно, будет лучшим выбором. Затем вы можете использовать sscanf () для его оценки.

Хорошее обсуждение темы здесь http://cboard.cprogramming.com/c-programming/109243-scanf-vs-fgets.html

Как разрешить ввод пробелов с помощью scanf? (Это был мой злой близнец, которого учили, что я забыл это - не я)

1 голос
/ 21 ноября 2013

Следует отметить, что scanf спецификации шаблона допускают ограничения ширины поля:

scanf( " %80s", mybuffer );

Но, где printf() позволяет ширине передаваться как переменная (с '*'):

printf( "My name is %*s.\n", 20, name );

scanf() нет. (Он интерпретирует '*' как флаг для полного подавления / игнорирования поля.) Это означает, что вы в конечном итоге делаете такие вещи:

#define NAMEWIDTH 40
char buffer[ NAMEWIDTH + 4 ];
...
scanf( " %40x", buffer );

и невозможно связать ширину поля 40 в scanf() с шириной буфера 40 в объявлении буфера.

1 голос
/ 10 августа 2009

scanf анализирует строку, которую вы прочитали (или создали), и fgets считывает строку из открытого ФАЙЛА *. Или ты имеешь ввиду fscanf?

0 голосов
/ 04 января 2012

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

См. Прототип двух функций:

char * fgets (char * dest, int size, FILE * stream);

int scanf (формат const char *, ...);

Вы можете видеть, что второй параметр fgets навязывает чтение не более чем символ размера.

Другим явным отличием является возвращаемое значение: fgets возвращает указатель на dest в случае успеха; scanf возвращает количество элементов ввода, которые были успешно сопоставлены и назначены. Затем функция scanf сканирует ввод в соответствии с форматом и считывает ввод из стандартного входного потока stdin , а fgets читает ввод из FILE * stream по умолчанию.

В заключение, вы можете использовать scanf для чтения данных из ФАЙЛА и вставки их в массив фиксированного размера (например), не имеет особого смысла. Преимущество scanf заключается в форматировании выходных данных: если функция читает 12345\n, вывод равен 12345, а fgets читает и возвращает до \n (включительно), добавляя \0 в конце в качестве ограничителя строки.

...