Подтвердить что ты не робот

Разница между scanf() и fgets()

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

4b9b3361

Ответ 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 в объявлении буфера.