我想采用浮点输入,但如果用户输入字符,它将显示无效输入,我没有在网上找到具体答案。它是如何完成的?
问问题
333 次
2 回答
2
考虑以下代码片段:
int num;
float val;
num = scanf("%f", &val);
if(num != 1)
{
printf("You didn't enter a float!\n");
}
scanf
返回它成功扫描的项目数。在您的情况下,您正在尝试扫描一个项目,一个float
. 如果用户不输入 a float
,scanf
将返回0
。
注意:如果scanf
失败,用户输入的任何垃圾数据仍将在stdin
流中。您必须手动冲洗它。这是一种这样的方式:
while(((ch = getchar()) != '\n') && (ch != EOF))
continue;
警告:不要fflush
在stdin
.
编辑
即使scanf
没有失败,stdin
缓冲区中可能仍有垃圾。例如,如果用户输入:
123xyz
123
将分配给浮点数,之后的所有内容都x
将保留在stdin
流中。
于 2014-08-09T20:52:05.027 回答
2
虽然scanf
解析 double 是安全的,但许多编译器已弃用它(有充分的理由),因为它在解析字符串时是不安全的。此外,如果解析失败,您将在输入缓冲区中留下剩余部分,您必须自己刷新它。
由于这些原因,更喜欢使用类似 的函数fgets
来检查其提供的缓冲区的长度,然后使用类似strtod
or的函数sscanf
来进行转换。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char buf[64];
/* read */
if (fgets(buf, sizeof buf, stdin)) {
/* convert */
char *err;
double d = strtod(buf, &err);
if (*err) {
puts("entry invalid");
} else {
printf("you entered %lf", d);
}
}
return 0;
}
于 2014-08-09T21:03:25.587 回答