2013-10-25 9 views
1

Я занимаюсь лабораторией для вводного класса программированияПроверка числового ввода в C

Я должен убедиться, что введено целое число. Я думал, что это будет сделано, но когда я поставлю письмо, оно повторяется в бесконечном цикле.

Я нашел это решение в другом посте

int num; 
char term; 

if (scanf("%d%c", &num, &term) != 2 || term != '\n') 
    printf("failure\n"); 
else 
    printf("valid integer followed by enter key\n"); 

Но им не уверен, что я сделал неправильно. Почему он не работает в моем коде?

#include <stdio.h> 

int main(void) 
{ 
    int oneVar; 
    char term; 
    double numOne; 
    double numTwo; 
    double sum; 
    double dif; 
    double quo; 
    double mult; 
    int checker = 1; 

    do 
    { 
     printf("Please choose one of the following:\n""1) Add\n""2) Subtract\n""3) Divide\n""4) Multiply\n""5) Quit\n"); 

     if (scanf("%d%c" , &oneVar ,&term) != 2 || term != '\n') 
     { 
      printf ("This is not valid input\n\n"); 
      checker = 1; 
     } 
     else if (oneVar == 5) 
     { 
      printf("Thank you. Goodbye.\n"); 
      checker = 0; 
     } 
     else if (oneVar != 1 && oneVar !=2 && oneVar != 3 && oneVar != 4) 
     { 
      printf("This is not a valid input\n\n"); 
      checker = 1; 
     } 
     else 
     { 
      printf("Please enter the first number:\n"); 
      if (scanf("%lf%c" , &numOne ,&term) != 2 || term != '\n') 
      { 
       printf ("This is not valid input\n\n"); 
       checker = 1; 
      } 
      printf("Please enter the second number:\n"); 
      if (scanf("%lf%c" , &numTwo ,&term) != 2 || term != '\n') 
      { 
       printf ("This is not valid input\n\n"); 
       checker = 1; 
      } 
      else if (oneVar == 1) 
      { 
       sum = numOne + numTwo; 
       printf("The sum is: %.2lf\n" ,sum); 
       checker = 0; 
      }  
      else if (oneVar == 2) 
      { 
       dif = numOne - numTwo; 
       printf("The difference is: %.2lf\n" ,dif); 
       checker = 0; 
      } 
      else if (oneVar == 3) 
      { 
       quo = numOne/numTwo; 
       printf("The quotient is: %.2lf\n" ,quo); 
       checker = 0; 
      } 
      else if (oneVar == 4) 
      { 
       mult = numOne * numTwo; 
       printf("The product is: %.2lf\n" ,mult); 
       checker = 0; 
      } 
      else if (oneVar == 5) 
      { 
       printf("Thank you. Goodbye.\n"); 
       checker = 0; 
      } 
     } 
    } while (checker == 1); 

    return(0); 
} 

Мой профессор отправил это им не уверен, как это помогает, но я думал, что это может помочь кому-то Чтобы убедиться, что пользователь-вход число является целым числом, вы можете использовать понятие литья. Кастинг - это способ сказать C обрабатывать переменную, как если бы она была переменной другого типа.

так, если у меня есть что-то вроде этого:

double myDouble; 

myDouble = 5.43; 

printf ("%d", (int) myDouble); 

Он сообщит C печатать myDouble, но относиться к нему как целое. Будут напечатаны только 5, и вы не получите ошибок несоответствия типа. Вы можете использовать кастинг, чтобы проверить, является ли входной номер целым, путем сравнения ввода с (int) литой числа. Что-то вроде этого должно работать:

if(inputNum == (int) inputNum) 

Вы все равно получите 1.0 и 2.0, проходящие как допустимые числа, но на данный момент это нормально.

+6

Вот что добавить в ваше образование: научитесь думать как программист. Высказывание «это сходит с ума» абсолютно ничего не говорит о том, что именно происходит.Мало того, что вы можете понять и сформулировать результат, который вы получаете, намного облегчают людям, находящимся в stackoverflow, чтобы помочь вам, но также помогают разработчикам аналитических навыков. –

+0

Вы используете unix или MS Windows? В MS Windows это не так работает – Vorsprung

+0

Я сказал это, потому что я не знал, как это описать, но в основном он повторяется снова и снова в бесконечном цикле. Я использую малиновый pi с пользовательской ОС для своей программы. Как я уже сказал, я новичок, извините, если мой язык не в порядке, но я делаю все возможное! надеюсь, это уточнит мой вопрос. –

ответ

1

Использование «%c» для «потребления» конца линии не является хорошим решением. Если пользователь вводит сказать:

123 abc<newline>

num будет 123, но term будет пробел. Если вы введете букву, а не число, сканирование остановится, не потребляя ни одного из символов, следующий входной вызов вернется из-за уже буферизованной линии и может все еще ничего не потреблять. Ваша программа постоянно работает, потому что каждый оператор ввода не потребляет новую строку и немедленно возвращается. Стандартные функции ввода ждут полной строки перед возвратом, если строка не читается полностью, входные функции не нужно ждать.

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

int check = scanf("%d", &num) ; 
while(getchar() != '\n') 
{ 
    // do nothing 
} 

if(check != 2) 
    printf("failure\n"); 
else 
    printf("valid integer followed by enter key\n"); 

Если используется формат %c спецификатор в конце ввода, а затем немного другой поток необходимо, так как входной символ может быть символ новой строки:

int check = scanf("%c", &ch) ; 
while(ch != '\n' && getchar() != '\n') 
{ 
    // do nothing 
} 
1

Почему усложнять?

char x = 0; 
scanf("%c", &x); 
if (x >= 0x41 && x <= 0x7A) 
printf("you entered a letter"); 

В ASCII таблицы, буквы имеют значения между 0x41 ("A") и 0x7A ("г"). Итак, вам просто нужно проверить значение ASCII для ввода. :)

+0

Она сказала, что находится в вводя курс программирования, поэтому без объяснений это не ответ. –

+0

Это гораздо более простой способ сделать это, поэтому я заменил его на использование этой логики, но он все еще не работает, когда я ввожу букву для второго ввода, чтобы первое число приходилось в уравнение. Где он говорит «Пожалуйста, введите первый номер», что я хочу сделать, это напечатать «Это недопустимый ввод \ n», а затем начать с начала, чтобы вернуться в исходное меню. но это выход я получаю: Пожалуйста, выберите один из следующих вариантов: 1) Добавить 2) Вычесть 3) Разделить 4) Умножение 5) Quit Пожалуйста, введите первое число: е Пожалуйста, введите второй номер: Сумма: -36046567177420279509914 с большим количеством цифр –

+0

В основном это не позволяет вам вводить больше ввода. –

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