2012-01-02 20 views
2

ここではNoobの質問がありますが、私は自分自身にCを教えていて、安全で正しい方法でユーザ入力を理解しようとしています(参考のため、これはGNU C Programming Tutorial 10.6(58-59)および15.5.5(107))。1文字のユーザ入力とfgets

マイ所望のプログラムフローは単一の数字

  • GETユーザ入力
  • 検証ユーザ入力
  • ため

    • プロンプトユーザ

    有効プリント正しい配列項目場合問題は、ユーザーが単純にハードリターンを入力すると、配列読み込み関数がmy_array [0]から読み込んで出力するということです。私は、検証が失敗に終わる方法を理解できません。メインで

    if (get_line (digit_input, sizeof (digit_input), stdin) != NULL) { 
        if (validate (digit_input) == 0) { 
        digit = atoi (digit_input); 
        printf("\nThe Morse code for %d is: ", digit); 
        morse(digit); 
    } 
    

    GET_LINEおよび検証機能:私は空白の入力を無効にするにはどうすればよい

    char *get_line(char *s, size_t n, FILE *f) { 
        unsigned int last; 
        char *p = fgets (s, n, f); 
    
        if (p != NULL) { 
        last = (strlen(s) - 1); 
        if (s[last] == '\n') s[last] = '\0'; 
        } 
        return p; 
    } 
    

    int validate(char *a) { 
        unsigned x; 
    
        for (x = 0; x < strlen(a); x++) 
        if (!isdigit(a[x]) || (a[1] != '\0')) return -1; 
    
        return 0; 
    } 
    

    ? (文字列が\ n \ 0を読み込んだ場合)なぜ、文字がない(つまり、\ n)入力が0になり、配列の読み込み関数に渡されるのでしょうか?

    ありがとうございました!

  • 答えて

    0

    validate機能のbegginingで次のテストを追加します。

    if (strlen(a) == 0) return -1; 
    

    ので、空白の入力は無効になります。

    +0

    ありがとうございます - これは最も一般的なように私はこの行を使用して終了しました。空のエントリが間違った入力タイプとは異なる問題であると考えたので、数字以外のエントリとは異なる戻り値を設定します。 –

    +0

    "strlen(a)== 0"は過剰です(一部のシナリオではパフォーマンスが低下する可能性があります)。 "a [0] == '\ 0'"ははるかに高速です - なぜ文字列の最後まで行かなければならないのですか? – ugoren

    +0

    @ ugoren point taken。私が今読んだget_lineに依存しているのは、main()ではなく、一度に1つのステップしかないということです。 –

    1

    validateファンクションは、strlen()が0の場合は0を返しますが、これは必要ではありません。

    0

    正確に1桁の数字が入力されることを正しく理解していますか?

    だけで明示的に文字列の長さがちょうど1で、charが数字であることを確認します

    int validate(char *a) { 
        return strlen(a)==1 && isdigit(a[0]) ? 0 : -1 
    } 
    
    関連する問題