0

次の C コードの何が問題になっていますか? (更新しました)

int nfds = 0;
char c[2] = " ";
char ans[2] = " ";

printf("Test p or s [p,s]: p? ");
ans[0] = (char)getchar();
if (ans[0] != '\n')
  {
    ans[1] = '\0';
    printf("ans = %s\n", ans);
  }
else
  ans[0] = '\0';

/* FIXME: answering 's' -> nfds is never read */
printf ("Choose [0, 1, 2, 3]: 0? ");
c[0] = (char)getchar();
if (c[0] != '\n') 
  {
    c[1] = '\0';
    nfds = strtol(c, NULL, 10);
  }
else
  c[0] = '\0'
printf( "nfds=%d\n", nfds);

「return」と答えると機能しますが、「s + return」と答えると、print(「Choose ...」) で止まらず、「return」が既に与えられているかのように続行しますか?

おそらくより良い解決策は次のとおりです。最初に char/string を読み取りansます。デフォルト: "return"char/string='s'/"s" で次の質問をして整数を読み取りnfdsます。デフォルト:"return"

4

2 に答える 2

4

初め:

c[2] = '\n';

c[2]2 つの要素の配列にはありません。についても同じですans

2番:

c[1] = getchar();
...
nfds = atoi(c);

配列には 2 つの要素があり、文字列は null で終了する必要があります。上書きするc[1]と、c配列は文字列を保持できなくなります。

は ではなくをgetchar返すことにも注意してください。これは、戻り値を と比較する必要がある場合に重要です。intcharEOF

またatoi、関数はエラー チェックを実行できません。使用する必要がありますstrtol

于 2012-12-18T21:27:08.340 に答える
1

ouah が言ったことに基づいて構築するには、 getchar()は、押されたキーの10 進数値である int 値を返します。したがって、ユーザーのキーストロークを int としてキャプチャし、それを char として型キャストして、char 配列に挿入する必要があります。

int key_stroke;
char array[size]

key_stroke = getchar();
array[1] = (char)key_stroke;

私が間違っている場合は訂正してください。ただし、Enter キーが押されるまでキーストロークを処理しようとしていますか? これは、次のコードを使用すると、はるかに簡単かつクリーンに実行できます。

int key_stroke;
char array[size]

for(i = 0; ((char)key_stroke != '\n') && (i < size); i++)
{
  key_stroke = getchar();
  array[i] = (char)key_stroke;
}

ユーザーが押すキーは、Enter キーが押されるか、配列のスペースがなくなるまで、array[] に追加されます。「i」はローテーションごとに増加するため、インデックスは自動的に更新されます。

于 2012-12-18T21:53:25.167 に答える