#include <stdio.h>
void number_checker(int n);
int main(void) {
int a, b;
while (1) {
printf("Digit checker\n");
printf("\nEnter the character: ");
scanf("%d", &a);
number_checker(a);
printf("\nIf you want to continue press 1\n");
scanf("%d", &b);
if (b == 1) {
continue;
} else {
printf("Thanks for using");
break;
}
return 0;
}
}
void number_checker(int n) {
if (n >= 0 && n <= 9) {
printf("\nEntered character is a digit\n");
} else {
printf("\nEntered character is not a digit\n");
}
}
字符串
的数据
它对整数很好,但对其他字符却陷入了循环,我想知道为什么它会永远运行下去
3条答案
按热度按时间v7pvogib1#
scanf("%d", &a)
跳过标准输入中的任何白色字符,然后尝试读取数字并将其转换为int
值,并将其存储到a
中。如果您键入一个带有小数点的数字,
scanf()
将在小数点处停止,这不是一个数字,如果.
之前至少有一个数字,则返回1
,并将int
值存储到a
中。随后的调用
scanf("%d", &b)
找到了挂起的.
,并且未能转换int
,使b
保持不变,即:未初始化,并返回0
以指示它无法执行单个转换。循环继续进行,每次调用
scanf()
都以相同的方式失败,没有从标准输入中消耗任何字符。这解释了你的观察。不应直接使用
scanf()
,而应一次读取一行输入,并使用sscanf()
尝试转换,检查返回值并报告任何无效或丢失的输入。您应该检查
scanf()
的返回值以检测无效或丢失的输入。还要注意的是,
%d
读取和转换的是一个整数(双关语),而不仅仅是一个数字,所以在函数number_checker()
中的测试有点不合适。以下是修改后的版本:
字符串
qnzebej02#
输入的意思是
scanf("%d", &a)
和scanf("%d", &b)
,非整数结果为error
的原因是scanf
函数中的%d
说明符专门读取舍入数。它甚至不会读取float
数字。vuktfyat3#
它会发生故障,因为您不能在
int
变量中存储非int
值。C编译器总是检查类型。为了克服这个问题,首先需要将其放入char array
中,然后检测它是否是一个数字,然后将其存储在int
变量中。快捷方式:
scanf
函数如果接收到数字,则返回1。示例如下:
字符串