2014-10-22 3 views
0

У меня есть программа на C, имитирующая взаимодействие ATM между пользователем и программой, принимая выбор входных данных, чтобы затем произвести вывод.Как мне получить консоль, чтобы ввести правильный ввод в C?

Пользователь должен ввести значение 1111, чтобы продолжить транзакцию, если это не так, программа выдает сообщение об ошибке и продолжает требовать от пользователя ввода правильного вывода, пока программа не прочитает в 1111.

Я попытался использовать цикл while, чтобы продолжать запрашивать правильное значение, 1111, и пока он не будет введен, программа продолжает просить пользователя ввести правильный вывод.

void main() { 

    int pin; 

    printf("Please enter the default pin: "); 

    while (pin != 1111) 
    { 
     printf("Invalid input "); 
     printf("Please enter the default pin again: "); 
     scanf("%d", &pin); 

     if (pin == 1111) 
     { 
      //The program continues 
     } 

    }  
} 

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

+3

Вы инициализируете 'pin' до * хорошего значения *, затем переходите прямо к' while! Good value', который не будет полностью зацикливаться. Поэтому либо вы не опубликовали правильный код, либо не видите никаких подсказок для булавки. – crashmstr

ответ

3

scanf возвращает результат (количество успешно прочитанных предметов). Вы должны использовать этот результат. Прочитайте документацию по scanf(3) и каждой функции, которую вы используете. Кроме того, добавьте \n в конце каждой строки printf управления форматом (или вызвать fflush(3) ...)

Compile со всеми предупреждениями и отладочной информации (gcc -Wall -g). Затем использовать отладчик (gdb)

2

Вы, наверное, хотите:

void main() 
{ 
    int pin ; 

    printf("Please enter the default pin: "); 
    scanf("%d", &pin); 

    while (pin != 1111) 
    { 
    printf("Invalid input\n"); 
    printf("Please enter the default pin again: "); 
    scanf("%d", &pin); 
    } 

printf("program continues..."); //The program continues 
} 

исполнение Образец

Please enter the default pin: 1234 
Invalid input 
Please enter the default pin again: 2222 
Invalid input 
Please enter the default pin again: 1111 
program continues... 
+0

Нет, 'scanf' должен * всегда * быть проверен на результат! –

+0

@BasileStarynkevitch правильно, но я думаю, что на этом этапе мы можем игнорировать это. –

+0

Нет, вы не можете, так как вы не инициализируете 'pin'. Если 'scanf' терпит неудачу,' pin' остается неинициализированным. –

1

Это проверяет, если зсапЕ успешно считывает целое число. Если он не работает, он будет читать один символ и повторить попытку.
Если scanf считывает целое число, он проверяется, является ли он правильным. Если нет, он снова запрашивает и сканирует.

#include<stdio.h> 
#include<stdlib.h> 

int main() { 
    int pin = 0; 
    int ch = 0; 

    printf ("Enter the default pin\n"); 
    while (pin != 1111) { 
     if (scanf ("%d", &pin) == 1) { // scanf read an int                
      if (pin == 1111) { 
       break; // the correct pin                     
      } 
      else { 
       printf ("Enter the default pin\n"); //reprompt               
      } 
     } 
     else { 
      while ((ch = getchar()) != '\n') { //scanf failed to read int. clear input and retry 
       if (ch == EOF) { 
        fprintf (stderr, "problem getting input\n"); 
        return 1;//if EOF exit 
       } 
      } 
     } 
    } 

    return 0; 
} 
+0

Зачем вам нужен getchar() в неудавшемся случае перед циклом. В потоке что-то застряло? Без него моя программа пеет, но не сканирует снова. – gowrath

+0

Вот что я подумал, поэтому я попытался сделать 'fflush (stdin)' вместо 'getchar()'. Есть ли какая-то конкретная причина, которая не работает? – gowrath

Смежные вопросы