2017-02-07 10 views
1

Я хочу взять один символ ввода, который вводит пользователь, а затем распечатать его с помощью методов printf() и fgets() (все это часть большей программы, но это изолированная проблема).Использование fgets() для размещения символа в массиве создает автоматический ввод?

include <stdio.h> 
include <stdlib.h> 
char input[1];  

int main(){ 
    printf("Please enter the minimum value the random number can be: "); 
    fgets(input, sizeof(input), stdin); 
    printf("\n%c", input[0]); 
} 

Как я ожидаю, что приведенный выше код для работы

Я думаю, что было бы распечатать сообщение Е(), а затем ждать ввода от пользователя. Независимо от того, что они набрали, я ожидал, что он возьмет первый символ этого ввода и снова распечатает его обратно на одну строку вниз.

Как приведенный выше код на самом деле работает

Программа печатает заявление начального Е(), а затем печатает пустую строку снизу, а затем программа завершается.

Почему в мире это? Почему код отвечает таким образом, а не как я ожидаю?

+1

Прочтите [руководство пользователя] (http://pubs.opengroup.org/onlinepubs/009695399/functions/fgets.html). – user2357112

+0

'fgets (buffer, size, file)' читает не более 'size-1' байт. Вот почему. – DyZ

+0

Строки в C/C++ заканчиваются нулем, поэтому 'fgets' хотел бы иметь место как для строки, так и для завершения нулевого символа. 1 символа достаточно, чтобы соответствовать только нулевому символу. – yeputons

ответ

3

С C11, глава 7.21.7.2, fgets() синопсис и описание (курсив мой)

char *fgets(char * restrict s, int n, FILE * restrict stream); 

fgets функция читает максимум один меньше, чем количество символов, указанных n из потока, на который указывает поток в массив, на который указывает s. [...]

и о причине за один меньше,

[...] нулевой символ записывается сразу после того, как последний считанный символ в массив.

В вашем случае, значение n поставляемая 1, следовательно, fgets() на самом деле ничего не читал !!

Необходимо изменить размер массива два 2, один элемент для ввода и один элемент для завершающего нуля.

+0

А, это объясняет это тогда! В документации, которую я читал, не упоминалось об этом. Сменив его на 2, я решил проблему! (Я буду принимать этот ответ, когда таймер позволяет мне) – Guy

1

Вам нужно пространство для хранения терминатора NUL, поэтому предоставление буфера размера 1 означает невозможность ввода данных.

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