我碰到这个代码(即作品)跌跌撞撞:......为什么它的工作原理?
它不起作用,一般来说。太多的失败案例
给定的输入可以是单个字符Z
,后续代码未定义行为(UB)作为scanf()
不分配a
。结果:(int)a
是UB。
scanf("%f",&a);
q=(int)a;
给定的输入可能是“123456789”,东西的int
的范围之外,然后用(int)a
转换也UB。
如果a
取值为INT_MAX
,++q;
为UB。
输入值可以精确地表示为int
而不是float
失败OP的代码。被四舍五入到整数像"0.99999999999999999999999999999"
输入 - >1.0f
失败OP的检测
替代。
scanf(), fgets()
不读C字符串,int
,float
等取而代之的是,更好地把它们当作阅读文本并将它们转换为C字符串,int
,float
。
f
in scanf()
意味着格式化输入,这是未知的部分在这里。最好避免scanf()
。
由于代码需要检测有关用户输入的各种内容,请使用fgets()
来读取文本的行。然后使用strtol()
,strtoll()
,strtoul()
等查看输入是否符合目标类型。
// Check if input fits in a `long`
char buf[100];
if (fgets(buf, sizeof buf, stdin) == NULL) {
puts("End-of-file or input error");
} else {
char *endptr;
errno = 0;
long ivalue = strtol(buf, &endptr, 0);
if (buf == endptr) puts("Fail: no conversion");
else if (*endptr != '\n' && *endptr != '\0') puts("Fail: Extra junk");
else if (errno) puts("Fail: Overlfow");
else printf("Success: %ld\n", ivalue);
}
该代码是不可能的,如果你输入987654321作为价值的工作。如果您输入ABC,则更不可能工作。 –
这段代码与输入是“char”还是“string”无关。 –
*总是*测试'scanf'的返回值,这里应该是'1'。如果你想输入一个'int',那么这样做,检查1值是否被转换,并检查输入流中的下一个“char”是否为空格。 –