2016-10-25 67 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++; 
}