如何检查scanf输入是否为数字?(用户输入必须是浮点值)



我想检查用户输入是浮点/整数还是字母。为此,scanf((的使用非常重要。我的问题是一封信被保存为零,但我不能排除它。

我试着用if来构建求解它,作为一个条件,我尝试了isalpha((和is digit((。我尝试了很多其他的东西,但不值一提。

如果实际需求如下:

从用户处读取一系列数字(整数或浮点数(。当用户键入数字以外的内容(如字母(时停止阅读。

,则使用scanf的解决方案非常简单:

#include <stdio.h>
int main() 
{
int maxnums = 10;
double numbers[maxnums];
int i;
for(i = 0; i < maxnums; i++) {
printf("enter a number, or nondigit to quit: ");
fflush(stdout);
double x;
if(scanf("%lf", &x) != 1)
break;
numbers[i] = x;
}
int nnum = i;
printf("you typed %d number(s):n", nnum);
for(i = 0; i < nnum; i++)
printf("%d: %fn", i, numbers[i]);
}

如果scanf返回1以外的值,则循环停止(使用break语句;我希望您现在已经在类中了解了这一点(,这表明无法读取任何数字。循环也会在用户输入10个数字后停止,因为这就是输入数组的大小

看起来这个循环只读取浮点数,从某种意义上说确实如此,但如果用户键入一个纯整数,如123,没有小数点,那么作为浮点输入仍然是完全可以接受的,它将被读取为浮点值123.000。

另一方面,如果需要能够判断用户是否真的输入了纯整数与浮点数,或者如果需要对纯整数做其他事情,而不是将它们与浮点输入存储在同一数组中,或者,如果需要知道(读取并处理(用户为终止输入循环而键入的特定非数字输入,那么这些额外的要求都无法用这个简单的代码来满足。事实上,在我看来,使用scanf满足任何这些附加要求实际上都是不可能的,需要一些完全不同的方法,不涉及scanf

。。。检查用户输入是浮点/整数还是字母。。。

当输入可转换为float、整数或字符时,scanf()是一个弱函数,但OP报告scanf()是必需的。使用scanf()的要求被误导了。

首先将一行用户输入读取到字符串中。请确保限制输入宽度。

char line[100 + 1];
if (scanf(" %100[^n]", line) == 1) {
// Successfully read a line

现在处理字符串。使用strtof(), strtoll()解析float,integer。测试endptr是否转换成功。

char *endptr;   //  Record end of conversion.
errno = 0;
long long ll = strtoll(line, &endptr, 10);
if (endptr > line && errno == 0 && *endptr == 0) {
// Successfully parsed a long int
printf("long long: %ldn", ll);
} else {
errno = 0;
float f = strtof(line, &endptr);
if (endptr > line && *endptr == 0) {
// Successfully parsed a float
printf("float: %.9gn", f);
} else {
printf("otherwise <%s>n", line);
}
}

用于检测空行或长行的附加代码。

相关内容

  • 没有找到相关文章

最新更新