2017-06-12 17 views
-2

パスワードジェネレータを作成しようとしています。私が最後に主な機能を繰り返そうとするまで、すべてがスムーズに進んでいました。コードは次のようになります:プログラムを終了せずにmain()関数を繰り返すには?

私はコードのフィードバックをいただければ幸いです。私はまだ学習しています(いつでも学習を止めますか?)できるだけ早くできるように改善したいと思います。

// password generator 
#include <stdlib.h> 
#include <stdio.h> 
#include <time.h> 

int main() 
{ 
    char answer; 
    int c=0; 
    int passlength; 
    char randLWUPchar; // lowercase, uppercase, characters + numbers 
    srand(time(NULL)); // seeding function 


     printf("Type the wished password length:"); 
     scanf("%d", &passlength); 

     while(c < passlength){ 
      randLWUPchar = "qwertyuiopasdfghjklzxcvbnm1234567890QWERTYUIOPASDFGHJKLZXCVBNM"[rand() % 65]; 
      printf("%c", randLWUPchar); 
      c++; 
     } 
      printf("\n\n\t\t...if it fails to prompt as wished, please restart...\n"); 

     printf("\n\n\t\t Please select Y to restart or N to close"); 
     scanf("%c", &answer); 

     if (answer == 'Y'){ 
       return main(); 
     } 
     else if (answer == 'N'){ 
       return EXIT_SUCCESS; 
     } 
} 
+1

...あなたはサブルーチンことを確認する必要があり、かつ「メイン」ときに、ユーザーの種類Y. –

+4

あなたからそれを呼び出します'main'関数を*繰り返さない*あなたは*呼び出しています。再帰的に 'main'を呼び出すことは合法ですが、一般的にはあまり推奨されません。あなたは何がうまくいかなかったか教えてくれませんでした。その情報をあなたの質問に含める必要があります。コンパイル時にエラーメッセージが表示されましたか?プログラムが間違った出力を生成しましたか?そして、あなたの目標は、再帰的な呼び出しよりも、ループによってほぼ確実に満たされるでしょう。 –

+2

あなたの直面した問題(他の場所で解決されているはずです)は、 'scanf("%d "、...)'に応答して数字を入力してからEnterを押しました。この数字は 'scanf'呼び出しによって消費され、Enter(' '\ n''')は次の 'scanf("%c "、...)'によって消費されます。 stdinから数値を読み込みたい場合は、その数値を読み込み、次の入力を破棄して次の '\ n'まで含めなければなりません。 –

答えて

2

再帰を使用しないようにリファクタリングすることをおすすめします。

オプティマイザをフルブラストで使用すると、このテールコールは簡単に最適化する必要がありますが、オプティマイザに依存しないでください。代わりにループを使用してください。以下のような何か試してみてください

do 
{ 
    // your code 
} while(answer == 'Y'); 

return ERROR_SUCCESS; 
1

反しコメントで言われているものには、はい、あなたのmain()は再帰的にすることができます。

@Keith Thompsonさんが言及しているように、passlengthを読んだあと、'\n'をフラッシュする必要があります。例:次に

scanf("%d", &passlength); 
    fgetc(stdin); 

`main`に対する不要な再帰呼び出します
scanf("%c", &answer); 
    fgetc(stdin); 
関連する問題