Два возможных подхода. Можно было бы изменить код:
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;
}
Ну, что он делает, так как вы установили b = 1, когда вы видите цифру, а вход заканчивается цифрами. –