Пытаясь понять, как разные способы ввода происходят в C, однако fgets () имеет тенденцию пропускать - PullRequest
0 голосов
/ 23 октября 2018

Я новичок в C и пытаюсь узнать, как работают разные входы.Я написал этот код, чтобы попробовать getChar (), sscanf () и fgets ().Мой первый fgets () работает отлично, но второй пропускается после того, как я прошу пользователя ввести дату.Я использую эти функции таким образом, что они не должны использоваться.Каковы возможные способы решения этой проблемы.

Также есть какие-то другие способы получения пользовательского ввода, которые были бы более полезными при определенных сценариях.

#include <stdio.h>

#define MAX 12
#define MAX_DATE 100

int main(int argc, const char * argv[]) {

    char buf[MAX];
    char date[MAX_DATE];
    char day[9], month[12];
    int year;

    printf("This code shows various ways to read user input and also how to check for input\n");

    printf("Enter a String less than 11 characters for input: ");
    fgets(buf, MAX, stdin); //stdin is used to indicate input is from keyboard

    printf("Enter a char: ");
    char inputChar = getchar(); //gets next avalible char

    printf("\nThe char you entered is: "); putchar(inputChar); //puts char prints a char

    printf("\nsscanf allows one to read a string and manupilate as needed.\n");
    printf("\nEnter a date as follows: Day, Month, Year");

    fgets(date, MAX_DATE, stdin);
    sscanf(date, "%s, %s, %d", day, month, &year);

    printf("\nFormatted values as follows... \n");
    printf("day: %s\n", day);
    printf("month: %s\n", month);
    printf("year: %d\n", year);

    return 0;
}
/*
Output for the code:
This code shows various ways to read user input and also how to check for input
Enter a String less than 11 characters for input: hey
Enter a char: a

The char you entered is: a
sscanf allows one to read a string and manupilate as needed.

Enter a date as follows: Day, Month, Year
Formatted values as follows... 
day: 
month: 
year: -1205589279
Program ended with exit code: 0
*/

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

@ contrapants хорошо объясняет причину "пропуска второго".Когда пользователь вводит a Enter , 'a' читается getchar(), а '\n' читается fgets(), не ожидая дополнительного ввода.

Для учащегося я рекомендую использовать только fgets() для ввода.

 printf("Enter a char: ");
 fgets(buf, sizeof buf, stdin);
 char inputChar = 0;
 sscanf(buf, "%c", &inputChar);

Использую ли я эти функции так, как их нельзя использовать.

При чтении в буфер возникает сбой, не гарантируя переполнения.Используйте ограничения по ширине.

char day[9], month[12];
//sscanf(date, "%s, %s, %d", day, month, &year);
int count = sscanf(date, "%8s , %11s , %d", day, month, &year);
if (count != 3) {
  Handle_unexpected_input_somehow();
}  
0 голосов
/ 23 октября 2018

Ваш второй fgets не пропускается.Он получает остальную часть вашей строки.

В вашем примере, когда появляется запрос «Введите символ:», вы вводите «a», за которым следует новая строка.getchar получает символ "а".fgets начинается с символа, следующего непосредственно за ним, что означает, что он читает новую строку после «а» и возвращает.

Если вы вызываете fgets(buf, MAX, stdin); после вашего getchar(), чтобы отбросить оставшуюся часть строки,ваша программа будет работать так, как вы ожидаете.

...