Scanf returns 1 instead of 0 when an error occurres
我已经读到,返回的值
我已经使用返回值来检测输入是否为整数,但是如果输入为
她是我的代码:
1 2 3 4 5 6 7 8 9 10 |
在多篇不同的文章中,您建议使用返回的
返回值不表示成功或失败。它是成功转换的值的数量。
这就是为什么您在" 4.5"上以"
您可以通过阅读
问题是
在您的情况下,
最安全的方法是使用
在您的特定情况下(卡在
1 2 3 4 5 6 7 8 9 10 | float xf; if (scanf("%f",&xf) == 1) { // one integer or float was scanned x = (int)xf; if (x==xf) { // scanned value is an integer: valid } } |
但是像
Scanf returns 1 instead of 0 when an error occurs
输入未发生错误。 第一个字符
I am forced to use scanf in collage
这样的编码约束是不幸的。
how could I detect if it's integer or not in simple fast way without destroying my whole code in c?
扫描整数并查找结尾的垃圾。
1 2 3 4 5 6 7 |
当数据为非整数输入时,某些有问题的字符可能会保留在
生产代码更可能读取一行然后对其进行解析。
我最初不想写答案,而后留下评论。我想要
扩展Jean-Fran?ois Fabre的答案。
相信他们会这样做,然后就为何会这样做"奇怪"感到困惑。实际上,他们根据格式扫描输入并为
变量(通过指针传递)。当他们遇到错误时,即某事
与格式不匹配,则它们停止。
使用格式
说"读一个整数,只有一个整数"。为此,您还需要
排除其他所有内容,如果我没有记错的话,那将是
这个
这就是为什么用户输入
错误地,因为您假设
只要"。
如您所见,很难找到一种可以捕捉的格式
一切,并告诉您用户何时出错。用户输入又名什么
用户输入的内容是随机的,可能包含(无意间)错误,请
格式等。因此,您最终会得到非常复杂的格式,只能确定
用户在末尾添加了一个点,如果这样做则失败。
这就是为什么我的建议是通过
如果格式良好,则可以解析
这是
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #include <stdio.h> #include <stdlib.h> int main(void) { const char *entries[] = {"4.5","4","some random text" }; char *ptr; int i; for(i = 0; i < sizeof entries / sizeof *entries; ++i) { long int res = strtol(entries[i], &ptr, 0); if(*ptr != '\\0') { printf("The input '%s' is not an integer. The non-integer is '%s'\ ", entries[i], ptr); } else { printf("The input '%s' is an integer: %ld\ ", entries[i], res); } } return 0; } |
哪个返回
1 2 3 | The input '4.5' is not an integer. The non-integer is '.5' The input '4' is an integer: 4 The input 'some random text' is not an integer. The non-integer is 'some random text' |
这是检查整个输入是否为整数的更精确的方法。
I have using the returned value to detect if the input is an integer or not but if the input was 4.5 scanf returns 1 while if the input was g scanf returns 0.
在这种情况下,这实际上是有道理的。
int ReturnedValue = scanf("%d",&x);
请记住,
-
如果输入4.5,它将仅读取第一个数字4并正确解释
int 值。它将丢弃输入中所有剩余的无效字符。 -
如果输入
d ,则scanf完全失败(它无法解析任何int),因此返回0。
请参阅scanf手册-查看为什么将4.5解析为整数4:
Reading of characters stops either when this maximum
is reached or when a nonmatching character is found, whichever
happens first.
http://man7.org/linux/man-pages/man3/scanf.3.html