我想要一个浮动输入但是如果用户输入一个字符输入它会显示无效输入,我没有在网上找到具体的答案。 怎么做?
答案 0 :(得分:2)
考虑以下代码片段:
int num;
float val;
num = scanf("%f", &val);
if(num != 1)
{
printf("You didn't enter a float!\n");
}
scanf
返回成功扫描的项目数。在您的情况下,您尝试扫描一个项目float
。如果用户未输入float
,scanf
将返回0
。
注意:如果scanf
失败,则用户输入的任何垃圾数据仍将位于stdin
流中。您必须手动冲洗它。这是一个这样的方式:
while(((ch = getchar()) != '\n') && (ch != EOF))
continue;
警告:不要在fflush
上使用stdin
。
修改强>
即使scanf
没有失败,您仍可能在stdin
缓冲区中有垃圾。例如,如果用户输入:
123xyz
123
将分配给浮点数,x
之后的所有内容都将保留在stdin
信息流中。
答案 1 :(得分:2)
虽然scanf
可以安全地解析double,但许多编译器已经弃用了它(有充分理由),因为在解析字符串时它是不安全的。此外,如果解析失败,您将留下输入缓冲区中的遗骸,您将不得不自己冲洗它。
出于这些原因,更喜欢像fgets
这样的函数,它检查其提供的缓冲区的长度,然后选择像strtod
或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;
}