2014-01-28 114 views
2

我正在寫一個代碼,要求用戶輸入10個整數,然後將它們反饋給他。我想創建一個「scanf檢查」來限制字符輸入。 while循環的工作原理是它不接受char,但會跳過一個整數輸入。scanf檢查while while循環來限制整數輸入

int main() 
{ 

    int i = 0, number[10] = {0}; 
    char buf[128] = {0}; 

    for (i = 0; i < 10; i++) 
    { 
     printf("Please input number %d : ", i+1); 

     while(scanf("%d", &number[i]) != 1) 
     { 
     scanf("%s", &buf); 
     printf("Sorry, [%s] is not a number. Please input number %d : ", &buf, i); 
     } 
    } 

    for (i = 0; i < 10; i++) 
    { 
    printf("\n Number %d is %d", (10-i), number[9-i]); 
    } 

    return EXIT_SUCCESS; 
} 
+0

下一'scanf'聲明 –

+9

@SakthiKumar之前嘗試'fflush(標準輸入)':不,從不使用'fflush(stdin)' - 它會在許多平臺上導致UB。 –

+1

@SakthiKumar,謝謝你的輸入。 Paul R,你會推薦什麼? – MIIJ

回答

4

正如指出的H2CO3,不使用scanf,另一種是fgetsstrtol

int i, number[10] = {0}; 
char buf[128], *p; 

for (i = 0; i < 10; i++) { 
    printf("Please input number %d : ", i+1); 
    while (1) { 
     fgets(buf, sizeof(buf), stdin); 
     if ((p = strchr(buf, '\n')) != NULL) { 
      *p = '\0'; 
     } 
     number[i] = (int)strtol(buf, &p, 10); 
     if (p == buf || *p != '\0') { 
      printf("Sorry, [%s] is not a number. Please input number %d : ", buf, i + 1); 
     } else { 
      break; 
     } 
    } 
} 
for (i = 0; i < 10; i++) { 
    printf("\n Number %d is %d", (10-i), number[9-i]); 
} 
return EXIT_SUCCESS; 
+2

@MIIJ如果您發現答案有幫助(並且正確),那麼通過對答案進行投票表決來感謝他們。點擊帖子左側的向上箭頭。因此,在這種情況下,可能會回答並接受你最喜歡的那個(你已經做了)。 – Lundin

+1

@Lundin,感謝您的提示,我曾嘗試過,但似乎我沒有足夠的「聲譽」這樣做。我會盡快這樣做。 – MIIJ

+0

@Alter Mann,是否正確? * p ='\ 0'(如果(buf,'\ n'))!= NULL)//如果buf保存'\ n'值(返回鍵) ; // p char變量被設置爲空終止符,表示字符串的結束] ... ... x =(int)strtol(buf,&p,10); // x是在基礎10處從buf中的字符解析,直到p的值爲int。] ...如果(p == buf || * p!='\ 0') //如果p沒有被解析,那麼它就等於緩衝區值 // 2)我不明白第二個實體(當它只等於'return'時)?] ...什麼時候做它檢查信件? – MIIJ

1

該代碼也適用於整數也。我發現的唯一錯誤是在打印抱歉信息時,您正在打印i,應該是i+1

int i = 0, number[10] = {0}; 
    char buf[128] = {0}; 

    for (i = 0; i < 10; i++) 
    { 
     printf("Please input number %d : ", i+1); 

     while(scanf("%d", &number[i]) != 1) 
     { 
     scanf("%s", &buf); 
     printf("Sorry, [%s] is not a number. Please input number %d : ", &buf, i+1); 
     } 
    } 

    for (i = 0; i < 10; i++) 
    { 
    printf("\n Number %d is %d", (10-i), number[9-i]); 
    }