2016-07-16 38 views
-7

這個概念很簡單。計算機必須重複問題,直到它收到有效的回覆。這是我當前的代碼:重複輸入直到被回答正確

#include <stdio.h> 


int main(int argc, const char * argv[]) { 
int age; 

do{ 
printf("How old are you?\n"); 
scanf("%d", &age); 


if (age == 32767) 

{ 
    printf("Error, retry: \n"); 
} 

else 
{ 
    printf("Cool."); 
    break; 

} 
} 
while(age!=3267); 

return (0); 
} 

if else語句是爲了捕獲異常,因爲用戶輸入的內容不是整數。

我試過使用do-while循環,但它最終成爲一個無限循環 我使用了do-while循環,因爲我需要經歷該過程,直到獲得有效的年齡值。

我與當前的代碼輸出爲:

How old are you? 
g 
Error, retry: 
How old are you? 
Error, retry: 
How old are you? 
Error, retry: 
How old are you? 
Error, retry: 

它是這樣下去。

如果你能幫助我,這將是一件好事。

+0

使用'do while'循環。 – haccks

+0

「嘗試使用do-while循環但失敗...」 - 爲什麼?怎麼樣?你做了什麼?這不是編碼服務。見[問]。 – Olaf

+0

謝謝奧拉夫,我糾正了我的問題。 –

回答

1
  • 計算機必須重複問題,直到它收到有效的回覆。
  • (輸出)是這樣下去。

原因:

  • 的問題是,你在你的代碼接收輸入一次,然後進入循環來檢查age
  • 因爲年齡值不是每次迭代之後重新分配,如果第一intput是!=32767它總是錯的,進入一個無限循環或又稱奇循環

    scanf("%d", &age); //scans only once 
    
    do //enters loop 
    { 
        if (age == 32767) 
        { 
         printf("Error, retry: \n"); 
        } 
    
        else 
        { 
         printf("Cool."); 
        } 
    } while(age!=32767); 
    

的,如果else語句捕獲異常櫃面用戶類型的東西,是不是整數。

  • 沒有if (age == 32767)只會檢查,如果輸入的響應等於32767與否。

  • @davmaccomment,你永遠無法檢查比int變量的值的最大值的輸入值。

  • 相反,它會更好,如果你會這樣

    `if (age > 100 || age <0)` 
    
  • 指定範圍

解決方案:

避免這種掃描age每次迭代,也查看我所做的更改:

do{ 

    printf("How old are you?\n"); 

    if(scanf("%d", &age)==1) //checking if scanf is successful or not 
    { 

     if (age > 100 || age <0) 
     { 
      printf("Error, retry: \n"); 
     } 

     else 
     { 
      printf("Cool."); 
      break; //break loop when correct value is entered 
     } 
    } 

    else //if scanf is unsuccessful 
    { 
     char c; 
     printf("enter only integers\n"); 

     do 
     { 
      scanf("%c",&c); 
     }while(c !='\n' && c!= EOF); //consuming characters 
    } 

}while(1); //always true 
+1

'age> max_value_of_int'怎麼可能是真的?另外爲什麼不使用'INT_MAX'而不是試圖猜測最大值?最後,如果'scanf'失敗(因爲輸入不是數字)並且'age'處於未初始化狀態?比較它然後調用未定義的行爲。 – davmac

+0

@davmac是的!忘了int溢出:(我會在一段時間編輯 – Cherubim

+0

這是一個很好的答案,但最終的解決方案是一個無限循環 –

-1

使用do while循環。像:

Do{ 

// your code 
Age = // asign value 

}while(age>100 && age < 1); 

所以它會重複,直到100和1之間進入年齡它將停止,如果它會得到歲的B/W 1 - 100

感謝。希望它會有所幫助。

+0

我認爲你正在嘗試做 - 而(年齡<= 100 &&年齡> = 1); – dreamBegin

+0

@ Kuldeep1007tanwar:我不這麼認爲。但是代碼是錯誤的。 – Olaf

0

的一些要點:

首先,使用scanf來讀取用戶輸入的int通常允許空白必須先輸入:

scanf(" %d", &age); 

具體而言,這將跳過了以前的換行符之前輸入並且仍然被緩衝。

二,scanf返回一個值,指示它是成功還是失敗,以及它匹配的項目數。 你需要檢查這個返回值

int r = scanf(" %d", &age); 
if (r == EOF) { 
    break; 
} 
if (r == 0) { 
    printf("Error, retry: \n");   
} 

第三,如果scanf無法比擬的輸入它留在輸入緩衝區。如果您沒有從緩衝區中檢索它,則在您下次打電話給scanf時,它將無法再次匹配。由於這個原因,scanf對於處理用戶輸入根本不是很好。如果可能的話,最好是將一行輸入讀入緩衝區(如果您小心,可以使用fgets),然後處理緩衝區。作爲一個軟弱的替代,可以迫使一些輸入緩衝器,以通過掃描一個字符串被消耗掉,然後再嘗試讀取輸入前值:

int r = scanf(" %d", &age); 
if (r == EOF) { 
    break; 
} 
if (r == 0) { 
    printf("Error, retry: \n"); 
    scanf("%*s"); // match string but suppress assignment 
} 
else { 
    printf("Cool.\n"); 
    break; 
} 

這一修改得到你的代碼,至少一半工作狀態。

相關問題