Пользователи Windows могли бы хотеть добавить desktop.ini и thumbs.db.
Ваш scanf съел только номер, но не завершающий символ новой строки. Если вставить новую строку или пробел после% d, то возникнет противоположная проблема: слишком большое чтение.
Вот почему людям не нравится scanf.
Я бы посоветовал прочитать настоящую строку (используйте fgets (3)
), а затем с помощью sscanf ()
для сканирования строки.
Прежде всего, не не используйте fflush () для очистки входного потока; поведение не определено:
7.19.5.2.2 Если поток указывает на выходной поток или поток обновлений, в котором самый последний операция не была введена, функция fflush вызывает любые незаписанные данные для этого потока быть доставленным в среду хоста для записи в файл; в противном случае поведение undefined.
Проблема в том, что завершающий символ новой строки не используется спецификатором преобразования "% d", поэтому он сразу же принимается getchar ()
. Нет лучшего способа справиться с этим, но обычно подход состоит в том, чтобы прочитать всю строку как текст (используя либо fgets ()
, либо scanf ()
с размером "% s "спецификатор преобразования), который будет использовать новую строку, а затем преобразовать в целевой тип данных с помощью sscanf ()
или strtol ()
или strtod ()
".
Getchar () считывает \ n с клавиатуры в scanf - см. здесь для получения дополнительной информации
Может ли getchar получать возврат каретки, введенный после 1?
Я думаю, вы вводите ввод после ввода «1». Он будет принят getchar ()
. Таким образом, вы можете решить проблему, просто добавив дополнительный getchar ()
после исходного (непосредственно перед тем, как вернет 0;
).
** Я тестировал это, и это сработало.
для того, чтобы ваша программа работала, вы должны «очистить» входной поток перед вызовом getchar () с вызовом fflush (stdin). Это означает, что когда вы вводите на клавиатуре число, а затем клавишу возврата, буфер ввода получает оба символа, например '1' и '\ n', а ваш вызов scanf получает только '1', поэтому ' \ n 'остается во входном буфере. Когда вы вызываете getchar, вы «получаете» оставшееся '\ n'. Очистка ввода удаляет весь буфер.
#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();
}