2015-06-11 12 views
1

Всякий раз, когда я скомпилирую это, я получаю эту ошибку, и я не уверен, почему. Я копирую это прямо из книги. Может ли кто-нибудь помочь?слишком мало аргументов для функции 'fgets' в C

#include <stdio.h> 
#include <string.h> 

int main(void) { 
    char buffer[256]; 

    printf("Enter your name and press enter:\n"); 
    fgets(buffer); 

    printf("Your name has %d characters and spaces!", strlen(buffer)); 

    return 0; 
} 
+6

Книга должна бросать в корзину. – BLUEPIXY

ответ

2

fgets принимает три параметра. Возможно, они имели в виду gets?

+0

Нет, это fgets, и есть действительно один параметр. Это странно. –

+0

Хорошо, получится, спасибо. Наверное, это было то, что они имели в виду. –

+2

Да. Согласно стандарту C: 'char * fgets (char * restrict s, int n, FILE * ограничивающий поток);' – AlexD

4

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

char *fgets(char *str, int n, FILE *stream) 
  • ул - это указатель на массив символов, где строка чтения хранится.
  • n - Максимальное количество символов для чтения (включая
    конечный нулевой символ). Обычно используется длина массива, прошедшая как str.
  • stream - Это указатель на объект FILE, который идентифицирует поток
    , из которого считываются символы.
+0

Спасибо. При проверке несколько раз моя книга все еще имеет fgets (buffer). Это ошибка?Я просто не понимаю. –

+2

Да. Я думаю, что это неправильно. – snr

+0

@WalterStraub Да, эта книга имеет ошибку (и, вероятно, более одного) – deviantfan

1

Код книги не соответствует ни одному компилятору С, используя стандартные библиотеки. Код исправлен ниже.

#include <stdio.h> 
#include <string.h> 

int main(void) { 
    char buffer[256]; 
    printf("Enter your name and press enter:\n"); 
    // fgets(buffer); 
    if (fgets(buffer, sizeof buffer, stdin) != NULL) { 

    // Remove potential \n 
    buffer[strcspn(buffer, "\n")] = 0; 

    // printf("Your name has %d ... 
    printf("Your name has %zu characters and spaces!\n", strlen(buffer)); 
    } 
    return 0; 
} 
  1. fgets() принимает 3 параметра: буфер, размер, поток.

    char * fgets (char * ограничение s, int n, FILE * ограничивающий поток);

  2. Всегда проверяйте возвращаемое значение с помощью функций ввода/вывода.

  3. Удалить потенциал '\n' как printf(..."characters and spaces" ...) как будто \n не было.

  4. strlen() тип возврата size_t. Для печати используйте спецификатор "%zu".

+0

Как обсуждалось в ветке комментариев для http://stackoverflow.com/a/30791263/3246555, 'fgets' часто, хотя и не всегда, добавляет' \ n'. – AlexD

+0

@AlexD detail: 'fgets()' не добавляет '' \ n'' по-другому, чем любой другой символ, который он читает. Он читает несколько символов 'char', будь то' 'A'',' '\ n'', или' '\ 0'' - любое значение' char', и сохраняет это в буфере. Чтение '' \ n'' является 1 из 3 условий завершения для успешного чтения (остальные 2: буфер заполнен, EOF после данных). 'fgets()' делает _add_ завершение '' \ 0'' в буфер, что делает его строкой C. – chux

+0

Да, я понимаю. Я имел в виду, что с точки зрения пользователя вывод будет выглядеть поодиночке, так как 'strlen (buffer)' будет считать новую строку как символ в имени. – AlexD

Смежные вопросы