2016-10-25 49 views
0

我正在读整数scanf,同时检查scanfscanf读数位数,第一个输出总是正确的,但之后输出又增加了一个。即scanf为第二个scanf读取最后的"\n"scanf%n给出错误的输出

我知道这种问题scanfcharscanf("%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

+0

也许与复制[什么是n的'sscanf的代表(S,“%d%N”,&I,N)'?](http://stackoverflow.com/questions/13199693/what -does-the-n-stand-for-in-sscanfs-dnin) –

+0

@ J.Piquard我没有说我不知道​​“%n”代表什么,当然也不是重复。我知道%n做了什么。 –

+0

首先你可以检查'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); 
2

事实上,你应该总是使用fgets()sscanf()strtod()strtol()等,不要打扰试图使普通scanf()工作,它只是不作为你的其他选择同样有效。

+0

请您详细说明为什么那些更好;特别是sscanf> scanf。 – 2501

+2

@ 2501:因为它不太容易出错。 –

+1

这不提供问题的答案。要批评或要求作者澄清,请在其帖子下方留言。 - [来自评论](/ review/low-quality-posts/14092781) –

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++; 
}