Почему не делает getchar (), ожидают меня для нажатия Enter после scanf ()?

Пользователи Windows могли бы хотеть добавить desktop.ini и thumbs.db.

16
задан DigitalRoss 11 April 2016 в 17:45
поделиться

7 ответов

Ваш scanf съел только номер, но не завершающий символ новой строки. Если вставить новую строку или пробел после% d, то возникнет противоположная проблема: слишком большое чтение.

Вот почему людям не нравится scanf.

Я бы посоветовал прочитать настоящую строку (используйте fgets (3) ), а затем с помощью sscanf () для сканирования строки.

22
ответ дан 30 November 2019 в 21:11
поделиться

Прежде всего, не не используйте fflush () для очистки входного потока; поведение не определено:

7.19.5.2.2 Если поток указывает на выходной поток или поток обновлений, в котором самый последний операция не была введена, функция fflush вызывает любые незаписанные данные для этого потока быть доставленным в среду хоста для записи в файл; в противном случае поведение undefined.

Проблема в том, что завершающий символ новой строки не используется спецификатором преобразования "% d", поэтому он сразу же принимается getchar () . Нет лучшего способа справиться с этим, но обычно подход состоит в том, чтобы прочитать всю строку как текст (используя либо fgets () , либо scanf () с размером "% s "спецификатор преобразования), который будет использовать новую строку, а затем преобразовать в целевой тип данных с помощью sscanf () или strtol () или strtod () ".

8
ответ дан 30 November 2019 в 21:11
поделиться

Getchar () считывает \ n с клавиатуры в scanf - см. здесь для получения дополнительной информации

2
ответ дан 30 November 2019 в 21:11
поделиться

Может ли getchar получать возврат каретки, введенный после 1?

3
ответ дан 30 November 2019 в 21:11
поделиться

Я думаю, вы вводите ввод после ввода «1». Он будет принят getchar () . Таким образом, вы можете решить проблему, просто добавив дополнительный getchar () после исходного (непосредственно перед тем, как вернет 0; ).

** Я тестировал это, и это сработало.

2
ответ дан 30 November 2019 в 21:11
поделиться

для того, чтобы ваша программа работала, вы должны «очистить» входной поток перед вызовом getchar () с вызовом fflush (stdin). Это означает, что когда вы вводите на клавиатуре число, а затем клавишу возврата, буфер ввода получает оба символа, например '1' и '\ n', а ваш вызов scanf получает только '1', поэтому ' \ n 'остается во входном буфере. Когда вы вызываете getchar, вы «получаете» оставшееся '\ n'. Очистка ввода удаляет весь буфер.

-10
ответ дан 30 November 2019 в 21:11
поделиться
#include <stdio.h> 
#include<conio.h>
void main() 
{ 
    int value; 
    printf("1. option 1.\n2. option 2.\n3. option 3.\n4. Exit\n\nMake an option: "); 
    scanf("%d", &value); 
    switch (value) 
    { 
        case 1: 
            printf("you selected the option 1."); 
            break; 
        case 2: 
            printf("you selected the option 2."); 
            break; 
        case 3: 
            printf("you selected the option 3."); 
            break; 
        case 4: 
            printf("goodbye"); 
            break; 
        default: 
            printf("thats not an option"); 
            break; 
    } 
    getch(); 
} 
-2
ответ дан 30 November 2019 в 21:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: