C scanf () и fgets () проблема - PullRequest
       24

C scanf () и fgets () проблема

3 голосов
/ 15 августа 2011

Я пытаюсь прочитать пользовательский ввод и сохранить его в виде строки, включая пробелы.Я выполнил поиск решения и указал на fgets () или scanf (% [^ \ n], str).Но оба эти решения дают мне ошибку.

Вот что у меня есть:

//MAX_CHARACTERS is set to 30

 scanf("%d", &input);
 if (input == 1){
        int pr;
        char na[MAX_CHARACTERS+1];
        printf("\nEnter the name: ");
        scanf("%[^\t\n]", &na);
        while (strlen(na)>MAX_CHARACTERS){
            printf("\nName is too long, enter new name: ");
            scanf("%[^\t\n]", &na);
        }// end na check
        printf("\nEnter priority: ");
        scanf("%d", &pr);
        while (pr>MAX_PRIORITY || pr <MIN_PRIORITY){
            printf("\nBad priority, enter new priority (0-100): ");
            scanf("%d", &pr);
        }//end pr check

Работает нормально, если я использую %s во всех случаях %[^\t\n], но когда я использую %[^\t\n] или

fgets(na, 30, stdin), он пропускает первое сканирование по имени и сразу переходит к «Введите приоритет:».Затем, когда я печатаю, у меня есть пустое имя с указанным приоритетом.

РЕДАКТИРОВАТЬ: Извините, пропущенные кавычки на первом scanf - опечатка.Не причина проблемы.Я набрал «1» для первого сканирования («% d», ввод).

ИСПРАВЛЕНО

Поскольку он не позволит мне опубликовать ответ,

Кто-то понял это.В случае, если кому-то все еще интересно, проблема была в первом scanf ().

scanf("%d", &input);

Он оставляет \ n в буфере.Второй принимает \ n и читает его как ввод, поэтому он пропускается.

РЕШЕНИЕ:

Установка

fflush(stdin); //right after the if statement seems to have fixed the issue. 

Спасибо всем за помощь.

Ответы [ 4 ]

6 голосов
/ 15 августа 2011

Эта проблема связана с использованием scanf() для ввода пользовательского ввода, оно не предназначено для обработки строк или любых неверных вводов.scanf() предназначен для чтения отформатированного ввода (например, файлов со строгим и конкретным форматом).При получении ввода от пользователя, ввод может быть искажен и вызывает проблемы. Вы должны использовать fgets(), чтобы прочитать ввод и разобрать его самостоятельно.

Чтобы ответить, почему второй вызов scanf() пропускается, это потому, что первый вызов потребляет только те цифры, которые получаютвведенный.Однако новая строка от нажатия Enter остается во входном буфере и, в свою очередь, является вводом второго вызова.Чтобы исправить это, вы хотите удалить этот символ новой строки из входных буферов.Самый безопасный способ сделать это - использовать getchar() до тех пор, пока не будет прочитан символ новой строки, а затем продолжить работу с программой.И избегайте использования шаблона fflush(stdin), это небезопасно и может вызвать больше проблем, чем стоит.

Вот простая функция, которую вы можете использовать для чтения символов до чтения новой строки:

void clear_newlines(void)
{
    int c;
    do
    {
        c = getchar();
    } while (c != '\n' && c != EOF);
}

Вызывайте это после любого вызова scanf(), который вы обрабатываете не строковые данные.

2 голосов
/ 02 августа 2013
    scanf("%d",&choice);
    fgetc(stdin);

Что я сделал, так это прочитал fgetc из stdin, и это оставило '\ n', так что ваш буфер является crear.

0 голосов
/ 15 августа 2011
scanf("%[^\t\n]", &na);

должно быть:

scanf("%[^\t\n]", na);

т.е. удалите &

Также fgets должна работать нормально, за исключением того, что она будет включать перевод строки, когда пользователь нажимает ввод. Вам придется скинуть его.

0 голосов
/ 15 августа 2011

первая строка кода:

scanf(%d, &input);

должно быть:

scanf("%d", &input);

т.е. кавычки отсутствуют

...