c - C中检测int的逻辑

标签 c loops int logic

我将不胜感激。我正在尝试创建这个简单的程序,它反复循环要求用户输入一个 int。如果他输入一个 int,它会退出,但如果他输入其他东西或比 int 更大的东西(例如 4gs4r33),它将再次循环要求输入一个 int。这是我尝试过的方法,但没有用。它说它是一个 int,即使它不是。

#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;

最佳答案

两种可能的方法。一种是修改您的代码:

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函数,它一直运行直到你得到了整数。注意 - 为了使其正常工作,我一次读取整个输入(而不是一次一个),然后使用 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;
}

关于c - C中检测int的逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21345631/

相关文章:

int - Dynamic AX 中的 bigint 等效项是什么?

c++ - 为什么在增加指针的整数值时得到一个随机数?

c# - 可以从 int[] 数组中获取 IntPtr 吗?

c++ - 内存分配栈

javascript - 如何在脚本第一次运行时在 Javascript 中打印一组名称,然后在第二次运行时出现提示?

c++ - 将 CString 转换为 Char 以更新数据库

java - 来自父类(super class)的方法

c - 对于我的 C 代码,我读取文件并对它进行排序会产生垃圾输出。为什么?

c - SHV ID : 79856 Can not create validator

支持 C11 的编译器