我想检查用户输入是浮点/整数还是字母。为此,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);
}
}
用于检测空行或长行的附加代码。