在程序里,希望从 scanf 里得到一个浮点数,但如果使用者输入了字符,或浮点数后面跟了多余的字符,需要提示使用者并报错。
应该怎么写出这样的语句呢?
double w;
scanf("%lf", &w);
输入:100kg
输出:错误!
输入:one hundred
输出:错误!
输入:100.0
输出:(程序继续)
在程序里,希望从 scanf 里得到一个浮点数,但如果使用者输入了字符,或浮点数后面跟了多余的字符,需要提示使用者并报错。
应该怎么写出这样的语句呢?
double w;
scanf("%lf", &w);
输入:100kg
输出:错误!
输入:one hundred
输出:错误!
输入:100.0
输出:(程序继续)
scanf是有返回值的,如果成功输入所有东西,返回值就是成功输入的东西的数量(不会累计)。
对你的情况而言,你每次只输入一个数,因此scanf成功时会返回1,失败了会返回0或负数。
返回负数的情况一般是流本身出了问题,返回0(或者少于预期,例如格式串"%d%d"要一次输入两个数,但只返回1时)则是用户输入有误。可以通过这点来判断输入是否成功。
====分割线====
demo:
char c;
int t;
double x;
while (1) {
t = scanf("%lf%c", &x, &c);
// 需要ctype.h
if (t == 0 || !isspace(c)) {
printf("error!\n");
break;
}
printf("Got: %lf\n", x);
}
原理:正常输入的话,浮点数之间一定有空白符。但考虑到有不正常的输入,事实上浮点数后可能会读到其他东西。我们可以在lf后紧跟着读一个字符,判断是不是空白符(也就是isspace,当字符是空白符时返回非0值)。如果scanf的返回值为0,就说明double没有成功读入,也是有错误的情形。