ここではNoobの質問がありますが、私は自分自身にCを教えていて、安全で正しい方法でユーザ入力を理解しようとしています(参考のため、これはGNU C Programming Tutorial 10.6(58-59)および15.5.5(107))。1文字のユーザ入力とfgets
マイ所望のプログラムフローは単一の数字
- プロンプトユーザ
有効プリント正しい配列項目場合問題は、ユーザーが単純にハードリターンを入力すると、配列読み込み関数が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になり、配列の読み込み関数に渡されるのでしょうか?
ありがとうございました!
ありがとうございます - これは最も一般的なように私はこの行を使用して終了しました。空のエントリが間違った入力タイプとは異なる問題であると考えたので、数字以外のエントリとは異なる戻り値を設定します。 –
"strlen(a)== 0"は過剰です(一部のシナリオではパフォーマンスが低下する可能性があります)。 "a [0] == '\ 0'"ははるかに高速です - なぜ文字列の最後まで行かなければならないのですか? – ugoren
@ ugoren point taken。私が今読んだget_lineに依存しているのは、main()ではなく、一度に1つのステップしかないということです。 –