我正在使用scanf
读取一个整数,同时检查scanf
读取的数字的数量,格式为%n
,第一个输出始终是正确的,但之后产量增加了一个。这是scanf
读取第二个"\n"
的最后scanf
。
我知道scanf
和char
的这类问题是scanf("%c",&cval)
--->到scanf(" %c",&cval)
留下一些空间以避免scanf读取行尾。但整数是什么?
我已经在这里看到了一些问题Link here并且他们似乎都认为scanf()
是"retarted"
并且应该始终使用fget()..它真的是这样吗并且它是好的在项目中避免它?我的意思是消除所有这些错误,有没有办法防止这种情况。
我是否必须使用fget()
,或者有办法在scanf()
中解决此问题。欢迎所有评论,感谢您的时间。我只是想知道是否有办法解决它,我知道如何使用%n。
#include <stdio.h>
int main(void) {
int i =0 ,byte_count = 0,val;
printf("Enter a number: ");
scanf("%d%n",&val,&byte_count);
while (i < 3){
printf("byte count is: %d\n",byte_count);
scanf("%d%n",&val,&byte_count);
i++;
}
return 0;
}
答案 0 :(得分:5)
第一个输出始终是正确的,但之后输出再增加一个。
后续扫描中n
的值大于预期值,因为它们在前一个条目的尾随'\n'
中扫描。 @BLUEPIXY
\n3876 --> 5 characters
not
3876
如果n
的扫描失败,也会重置"%d"
每个循环。
int val = 0; // add initialization
while (i < 3){
printf("byte count is: %d\n",byte_count);
byte_count = 0; // add
scanf("%d%n",&val,&byte_count);
i++;
}
在stdin
使用" "
while (i < 3){
printf("byte count is: %d\n",byte_count);
byte_count = 0;
scanf(" "); scanf("%d%n",&val,&byte_count);
i++;
}
答案 1 :(得分:2)
确实,您应该始终使用fgets()
加sscanf()
或strtod()
或strtol()
等。不要试图让scanf()
工作,它没有你的其他选择那么有效。
答案 2 :(得分:2)
%n
捕获scanf处理的所有字符,包括前导空格。使用%n两次可以纠正这一点。格式字符串跳过前导空格,然后获取字符的开始计数。然后扫描整数,最后捕获字符总数。计数的差异是整数中的字符
始终检查scanf的返回,因为输入流可能需要清理。
int begin = 0;
int end = 0;
int val = 0;
int clean = 0;
int result = 0;
do {
if ( ( result = scanf(" %n%d%n",&begin,&val,&endn)) != 1) {// scan one int
while ( ( clean = getchar ( )) != '\n') {//clean bad input
if ( clean == EOF) {
fprintf ( stderr, "problem reading input\n");
exit ( 1);
}
}
}
else {//scanf success
printf("byte count is: %d\n",end-begin);
}
} while ( result != 1);