2017-08-25 78 views
0

我有一個代碼。想法是當我需要輸入一個號碼,但我輸入一個非數字字符,檢查錯誤,並要求我輸入一個工作號碼,或繼續或中斷。但它跳過代碼不輸入數字。這是代碼:錯誤輸入號碼時在C跳轉代碼

int EnterNumber(){ 
    int number; 
    printf("Enter your's number:"); 
    if(!scanf("%d", &number)){ 
     puts("Keypress don't number!"); 
     int choose = 0; 
     puts("Work:\n\t1. Continue 2. Break \nYour's number will choose:");     
     while(!scanf("%d", &choose)){ // here it jumped.I cann't enter number! 
      switch(choose){ 
       case 1: 
        EnterNumber(); 
        break; 
       case 2: 
        break; 
       default: 
        puts("Keyboard don't recognize"); 
        break; 
      } 
     } 
    } 

    return number; 
} 

任何人都可以幫助我解決這個錯誤嗎?

+2

這是不是一個「跳」,它是*遞歸*,你可能不希望在這裏。你已經有了'while'循環,只需修復它。 –

+0

你能說我完全錯誤! –

+0

好的,謝謝。我解決了問題! –

回答

0

你似乎在你的文章中實現遞歸。但是代碼中的某些行不是必需的,並且會妨礙遞歸算法的潛在效率。

遞歸算法的要點可以在2條語句被捕獲:

1)每個遞歸調用應該在同一 問題, 即,更小的子問題的更小的實例。
2)遞歸調用最終必須達到一個基本情況,這是沒有進一步遞歸解決 。
from here

下面是原來的EnterNumber()函數的適應減少到僅具有上面列出的遞歸算法的那些要領。

  • 讀取和測試輸入字符(較小實例...)
  • 當測試失敗標準葉(基礎案例...)

根據需要它可被擴展包括您在原始帖子中需要的其他功能(例如更多用戶輸入,或通知用戶輸入不是數字)

void EnterNumber(char a); 

int main(void) 
{ 

    char c; 
    int num; 

    printf("Enter your number:"); 
    scanf(" %c", &c); 
    // ^notice space preceeding format char, 
    //  comsumes newline from previous read and allows next input 
    num = isdigit(c); 
    EnterNumber(c); 
    printf("\nHit any key to exit\n"); 
    getchar(); 
    return 0; 
} 

/// Simple demo of recursion: 
/// caches input as long as it is a number 
/// outputs cache and exits if alpha char 
void EnterNumber(char a) 
{ 
    if(isdigit(a) != 0) 
    { 
     printf("Enter your number:"); 
     scanf(" %c", &a); 
     // ^notice space preceeding format char, 
     //  comsumes newline from previous read and allows next input 
     EnterNumber(a);  
    } 
    printf("%c\n", a); 
} 

關於在格式字符串空間scanf()功能:

空白字符:該函數將讀取並忽略任何空白的下一個非空白字符 (空格字符包括空格,換行和製表遇到過 字符字符 - 見isspace)。格式字符串中的單個空格將驗證從流中提取的任何空白字符的數量(包括 無)。 (from here

+0

OP不需要遞歸。 OP對於如何再次提示用戶感到困惑 – pm100

+0

@ pm100 - 我不確定。至少也許在使用'scanf()'時清除空白空間的意見會有所幫助。謝謝。 – ryyker

+0

是的,這是他的錯誤 - 除了使用遞歸 – pm100