2017-08-25 8 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

あなたの投稿に再帰を実装しているようです。しかし、コード内のいくつかの行は必要ではなく、再帰アルゴリズムの潜在的な効率を妨げます。再帰アルゴリズムの

Essentialsは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はちょうど再びユーザーを促す方法についてちょっと混乱していた – pm100

+0

@ pm100 - わからなかった。 'scanf()'を使用しているときに空白をクリアするコメントが少なくとも多分役立つでしょう。ありがとう。 – ryyker

+0

はい、彼のバグでした - 離れて再帰を使用しての巨大な設計のエラー – pm100