Я хочу знать, в чем разница между fgets()
и scanf()
. Я использую C в качестве платформы.
Разница между scanf() и fgets()
Ответ 1
Существует несколько различий. Двумя важными являются:
-
fgets()
может считываться из любого открытого файла, ноscanf()
читает только стандартный ввод. -
fgets()
читает "строку текста" из файла;scanf()
можно использовать для этого, но также обрабатывает преобразования из строки в встроенные числовые типы.
Многие люди будут использовать fgets()
для чтения строки данных, а затем использовать sscanf()
для ее обработки.
Ответ 2
Scanf не выполняет проверку границ. fgets, вероятно, будет лучшим выбором. Затем вы можете использовать sscanf() для его оценки.
Хорошее обсуждение темы здесь - http://cboard.cprogramming.com/c-programming/109243-scanf-vs-fgets.html
Как вы можете вводить пробелы с помощью scanf? (Это был мой злой близнец, который читал лекции, чтобы забыть об этом, но не мне).
Ответ 3
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) просто считывает строку из потока входных файлов и копирует байты в качестве нулевой завершающей строки в буферную строку и ограничивает вывод в буфер заданными байтами в размере. p >
Ответ 4
scanf анализирует строку, которую вы читаете (или создаете), и fgets читает строку из открытого FILE *. Или вы имеете в виду fscanf?
Ответ 5
Основное различие заключается в том, что scanf
не имеет ограничений на количество символов, которые можно прочитать (по умолчанию используется), а fgets
- максимальное количество char, которое можно прочитать.
См. прототип двух функций:
char * fgets (char * dest, int size, поток FILE *)
int scanf (const char * format,...);
Вы можете видеть, что второй параметр fgets
устанавливает максимальный размер char.
Другим явным отличием является возвращаемое значение: fgets
возвращает указатель на dest
при успешном завершении; scanf
вернуть количество элементов ввода, которые были успешно согласованы и назначены.
Затем функция scanf сканирует ввод в соответствии с форматом и считывает входные данные из стандартного входного потока stdin, а fgets
по умолчанию вводит ввод FILE * stream.
В заключение вы можете использовать scanf
для чтения данных из FILE и вставки их в массив фиксированного размера (например) не имеет большого смысла.
Преимуществом scanf
является форматирование выходных данных: если функция читает 12345\n
, вывод 12345
, а fgets читает и возвращает до \n
(в комплекте), добавляя \0
в конце как ограничитель строк.
Ответ 6
Следует отметить, что спецификации шаблона 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 в объявлении буфера.