scanf与%n给出错误的输出

时间:2016-10-25 12:17:21

标签: c scanf

我正在使用scanf读取一个整数,同时检查scanf读取的数字的数量,格式为%n,第一个输出始终是正确的,但之后产量增加了一个。这是scanf读取第二个"\n"的最后scanf

我知道scanfchar的这类问题是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;
}

enter image description here

3 个答案:

答案 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);