如何确定c语言中的无效输入
我想接受浮点输入,但如果用户输入字符,它将显示无效输入,我在网上没有找到具体答案。如何确定c语言中的无效输入,c,input,floating-point,invalid-characters,C,Input,Floating Point,Invalid Characters,我想接受浮点输入,但如果用户输入字符,它将显示无效输入,我在网上没有找到具体答案。 它是如何完成的?考虑以下代码片段: int num; float val; num = scanf("%f", &val); if(num != 1) { printf("You didn't enter a float!\n"); } scanf返回它成功扫描的项目数。在你的例子中,你试图扫描一个项目,一个浮动。如果用户未输入浮点值,scanf将返回0 注意:如果scanf失败,用户输入的垃
它是如何完成的?考虑以下代码片段:
int num;
float val;
num = scanf("%f", &val);
if(num != 1)
{
printf("You didn't enter a float!\n");
}
scanf返回它成功扫描的项目数。在你的例子中,你试图扫描一个项目,一个浮动。如果用户未输入浮点值,scanf将返回0
注意:如果scanf失败,用户输入的垃圾数据仍将在stdin流中。你必须手动冲洗它。这里有一种方法:
while(((ch = getchar()) != '\n') && (ch != EOF))
continue;
警告:不要在标准DIN上使用fflush
编辑
即使scanf没有失败,stdin缓冲区中也可能有垃圾。例如,如果用户输入:
123xyz
123将被分配给float,x之后的所有内容都将保留在stdin流中。虽然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;
}
一个好的开始是在你最喜欢的搜索引擎(又名谷歌)上输入scanf。像123xyz这样的输入是有效的吗?每个人都建议scanf,因为scanf解析double不是“天生”不安全的。好吧,50%的scanf建议答案都建议scanf,因为scanf不是天生不安全的。@PascalCuoq:是的,很公平:解析一个数字,但我仍然不会使用/教授它。我删除了那个位{是一个问题,但方向正确。fgets通常会得到一个以\n\0结尾的字符串,然后*err将在其中包含“\n”。可能在if?输入之前添加isspace*err err++,例如123xyz是有效的?@SHR 123是有效的,但是xyz是无效的,并保留在stdin流中。您需要手动刷新它,因为它可能会被意外使用在另一个从stdin获取数据的函数调用中。为什么stdin上的fflush会产生问题?@Jimut fflush仅用于输出流,例如stdout.Minor:whilegetchar!='\n'->EOF上的无限循环。