2017-02-07 14 views
-3

Мне было интересно, если fgets() читает новый символ линии с пользовательского ввода, то есть на клавиатуре. Вот некоторые примеры кода я писал:fgets() Read New Line Char From Keyboard

while (1) { 
    char userInput[3] = {'\0', '\0', '\0'}; 

    fgets(userInput, 3, stdin); 
    flushStdin(); 
    printf("%s\n", userInput); 
} 

Если я типа «2», я reprompted ввести другой символ, и следующий результат:

$ 2 
$ 3 
    2 

$ 

Я понимаю, как fgets() работа, поэтому возможно, моя логика неверна. Требуемый выход:

$ 2 
    2 

$ 
+3

Откуда берется '' '? Кажется, что ваш код больше, чем вы показываете. Пожалуйста, предоставьте [mcve]. – kaylum

+0

Я не понимаю ваш вопрос, 'fgets()' читает целую строку или символы '3', если они вставлены первыми. Таким образом, он увядает, читается до '' \ n'' или пока в целевом буфере больше нет места. –

+1

Что такое 'flushStdin()'? Вы [не можете этого сделать] (https://stackoverflow.com/questions/2187474/i-am-not-able-to-flush-stdin), не вызывая неопределенное поведение (например, 'fflush (stdin)') или используя определенную платформу API .. –

ответ

0

Я думаю, что fgets() будет считывать до 1 меньше заданного размера буфера. Он примет \ n от ввода, когда вы нажмете enter. Вы можете использовать что-то вроде этого, чтобы очистить ввод для строк или использовать scanf() для ввода int

void readLine(char* buffer, int bufferLength, FILE* file) 
{ 
    fgets(buffer, bufferLength, file); 

    int len = strlen(buffer); 
    if(len > 0 && buffer[len - 1] == '\n'){ 
     buffer[len - 1] = '\0'; 
    } 
} 
+0

'fgets' читает' size_t' количество байтов (не 'int'), и аналогично' strlen' возвращает 'size_t'. Есть более простой способ: * очистить ввод *: 'buffer [strcspn (buffer," \ n ")] = '\ 0';'. Имейте в виду, что это фактически мешает одному из механизмов обработки 'fgets'; когда '' \ n'' * не найден *, вам нужно помнить, что вы имеете дело только с * частичной линией *, и подумайте о том, что * следующие данные могут быть ... – Sebivor

+0

@Seb 'char * fgets (char * str, int n, FILE * stream) 'использует' int' для 'n' байт, а не' size_t'. – RoadRunner

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

  • Нет связанных вопросов^_^