2013-03-05 2 views
2

Я пытался иметь защитное программирование с вводом как целое число, но программа входила бы в бесконечный цикл, если бы я ввел символ. Затем я переключился на ввод как символ, но он дважды выполняет цикл. Один раз для неправильного символа и один раз для окончания строки.защитное программирование в меню. какой тип ввода я должен иметь?

Есть ли способ получить цикл, только один раз?

код:

int main(int argc, char *argv[]) 
{ 
    char choice='5'; 
    while (choice != '1' && choice !='2' && choice !='3' && choice!='4' && choice!='0') 
     { 
      printf("Parakalw epilekste ena apo ta parakatw\n\n"); 
      printf("1.\tKafe 1.5 euro\n"); 
      printf("2.\tKafe me gala 1.8 euro\n"); 
      printf("3.\tSokolata 2.1euro\n"); 
      printf("4.\tSokolata me gala 2.4 euro\n"); 
      printf("0.\tExodos\n\n"); 
      printf("parakalw eisagete thn epilogh sas: "); 
      scanf("%c",&choice); 
     } 
system("PAUSE");  
return 0; 
} 
+0

Почему не целое число, например 'int n; scanf ("% d", &n); '? – Mikhail

+0

он переходит в бесконечный цикл, если n = любой символ вместо числа – n17n

+0

@NikolaosTsouktakos: это потому, что scanf не сможет прочитать число, а способ, которым ваш цикл написан, будет продолжайте пытаться, используя тот же самый вход навсегда. – teppic

ответ

2

scanf(" %c", &choice) Используйте, чтобы сделать его пропустить через пустое пространство, в противном случае новая строка остается в стандартный ввод после выбора символа, и он будет читаться в следующем Scanf вызова. Пробел перед спецификатором означает, что он будет соответствовать любому виду пробелов (пробелы, вкладки и возвраты).

+0

- это что-то вроде «защитного программирования» важно? Должен ли я искать его дальше или двигаться дальше? – n17n

+0

Всегда полезно проверить, что пользователь вводит допустимое значение. используйте цикл с оператором switch для обработки ввода, со случаем по умолчанию, который выводит сообщение об ошибке. – teppic

2

Для защитного программирования (что вы конкретно подразумеваете под этим), я бы не использовал scanf, так легко ошибаться.

Вместо этого прочитайте строку ввода с помощью fgets, затем проанализируйте ее по мере необходимости, затем используйте обрезку, собственный код синтаксического анализа или, возможно, sscanf, возможно, после некоторой проверки.

Кроме того, вы всегда должны проверить возвращаемое значение любой функции *scanf. Проверьте как фактическую ошибку, так и количество фактических данных.