2014-01-25 3 views
1

Я был бы признателен за помощь в этом. Я пытаюсь создать эту простую программу, которая многократно повторяет запрос о вводе пользователя в int. Если он вводит int, он выходит, но если он вводит что-то еще или больше, чем int (ex.4gs4r33), он снова зациклится на запрос ввода int. Это то, что я пробовал, и он не работает. Он говорит, что это int, даже если это не так.Логика обнаружения int in C

#include<stdio.h> 

unsigned int findInt(); 

int main() { 

printf("Please input an int.\n"); 
findInt(); 

} 

unsigned int findInt() { 
char input; 
long num = 0; 
int b = 0; 

do { 
    scanf("%c", &input); 

    if (isdigit(input)){ 
     num = num*10+input+'0'; 
     b = 1; 
    } 
    else if (input == '\n') 
     b = 1; 
    else 
     b = 0; 
} while(input != '\n');  

if (b == 1) 
    printf("Great!\n"); 
else{ 
    printf("Not an int \n"); 
    findInt(); 
    } 
return 0; 

}

+0

Ну, что он делает, так как вы установили b = 1, когда вы видите цифру, а вход заканчивается цифрами. –

ответ

0

В else ветви - т.е. не цифру или символ новой строки - вы установите b 0. Теперь, если цифра Вытекает сброса, что 1.

Вы будете вероятно, хотят break или как-то записать постоянный сбой, а не просто продолжать.

+0

Спасибо за ответ! Прошу прощения, но я не понимаю. Не могли бы вы уточнить? – pyramid

+0

Вы устанавливаете 'b' в 1, а затем в 0, а затем в 1 снова. В последнем случае добавьте 'break' после b = 0. – cnicutar

2

Два возможных подхода. Можно было бы изменить код:

b = 1; // start off with good intentions… 
do { 
    scanf("%c", &input); 

    if (isdigit(input)){ 
     num = num*10+input -'0'; // *** SUBTRACT '0', don't add it! 
    } 
    else if (input != '\n') { 
     b = 0; 
     break; // *** break when you find non-digit 
    } 
} while (input != '\n'); 

два изменения: получение математики права, как вы вычислить целое число, и фиксирующую логику (так что вы вырваться из вашего цикла, когда вы найдете нон цифрового символа)

Второй подход:

char buf[100]; 
char intAsString[100]; 
fgets(buf, 100, stdin); 
sscanf(buf, "%d", num); 
sprintf(intAsString, "%d\n", num);; 
if(strcmp(buf, intAsString) == 0) { 
    printf("yay - you entered an integer!\n"); 
} 

Я уверен, что вы можете понять, как это работает.

обновление полный фрагмент кода, который решает вопрос о «логике петли», а также: вы вызываете функцию findInt один раз с верхнего уровня, и он продолжает идти, пока вы не получите Int. Примечание. Для того, чтобы это работало правильно, я читал весь ввод сразу (а не один за раз), затем выбирал символы один за другим, используя sscanf (и обновляя указатель вручную). Он имеет ряд преимуществ - не в последнюю очередь из-за того, что вы начинаете со свежего ввода каждый раз, когда вы вызываете findInt, вместо того, чтобы иметь остальную часть входного буфера, которая все еще нуждается в чтении (и которая вызывала «нет», нет, большой!»- как вы могли бы продолжать читать плохой вход, пока не добрались до новой строки, и признать, что ...)

#include<stdio.h> 
#include <ctype.h> 

unsigned int findInt(); 

int main() { 
    findInt(); 
} 

unsigned int findInt() { 
char input; 
char buf[100]; 
char *temp; 
long num = 0; 
int b = 0; 
printf("please enter an int:\n"); 
fgets(buf, 100, stdin); 
temp = buf; 
do { 
    sscanf(temp++, "%c", &input); 
    if (isdigit(input)){ 
     num = num*10+input-'0'; 
     b = 1; 
    } 
    else if (input == '\n') 
     { 
     b = 1; 
     break; 
     } 
    else { 
     b = 0; 
     break; 
    } 
} while(input != '\n'); 

if (b == 1) 
    printf("Great! %d is an integer!\n", num); 
else{ 
    printf("Not an int \n"); 
    findInt(); 
    } 
return 0; 
} 
+0

Эй, большое вам спасибо за ответ. Когда я запускаю это сейчас, он говорит «Не int», за которым следует «Великий», а затем выходящий. Не повторяется снова запрос int. Может ли это иметь отношение к тому, что следует после утверждения while? – pyramid

+0

Извините, я не пытался исправить вашу логику цикла. Я подозреваю, что '\ n' все еще находится во входном буфере (возможно, ваша система производит \ r \ n?). Промыть входной буфер между вызовами 'findInt' с помощью' fflush (stdin) 'возможно? На телефоне прямо сейчас сложно правильно проверить ... – Floris

+0

@BLUEPIXY - что я думал ??? !!! Теперь лучше? Спасибо, что указали это. – Floris

0
#include <stdlib.h> 
#include <limits.h> 
#include <stdbool.h> 

void findInt(){ 
    int x; 
    bool ok; 

    do{ 
     char buff[32], *endp; 
     long long num; 

     ok = true;//start true(OK) 
     printf("Enter a number: "); 
     fgets(buff, sizeof(buff), stdin); 
     //strtoll : C99 
     x=(int)(num=strtoll(buff, &endp, 0));//0: number literal of C. 10 : decimal number. 
     if(*endp != '\n'){ 
      if(*endp == '\0'){ 
       printf("Too large!\n");//buffer over 
       while('\n'!=getchar()); 
      } else { 
       printf("Character that can't be interpreted as a number has been entered.\n"); 
       printf("%s", buff); 
       printf("%*s^\n", (int)(endp - buff), ""); 
      } 
      ok = false; 
     } else if(num > INT_MAX){ 
      printf("Too large!\n"); 
      ok = false; 
     } else if(num < INT_MIN){ 
      printf("Too small!\n"); 
      ok = false; 
     } 
    }while(!ok); 
} 

,