0

文字を配列にスキャンする際に問題が発生しています。これを行うたびに、次のスキャンをスキップして次のスキャンに進みます。入力に ​​'\n' も追加されるため、何が起こっているかはわかっていますが、その原因を解決する方法がわかりません。サンプルコードは次のとおりです。

char charray [MAX], ffs;
int inarray [MAX], i;


for (i = 0; i < MAX; i++)
{
    charray[i] = getchar();
    printf ("%c\n",charray[i]);
    scanf ("%d", &inarray[i]);
    printf ("%d\n",inarray[i]);
}
4

3 に答える 3

0

あなたは2つの機能で標準入力から読んでいます:getchar()scanf()。それらがどのように機能するかを理解する必要があります。

getchar()簡単です:入力ストリームで次に使用可能な文字を返します(または1つ待つか、戻りますEOF

scanf("%d", ...)より複雑です。最初に、オプションで空白(スペース、Enter、タブなど)を破棄し、次に整数を表すためにできるだけ多くの文字を読み取り、整数に使用できない最初の文字で停止します。のように'\n'

それらをループに入れているので、あなたのgetchar()呼び出しは停止したキャラクターを取得しscanf()、次scanf()はそこから進みます。

入力が"q1w22e333r4444"(MAX == 4の場合)のようなものである場合、プログラムは機能します。

入力が次のようなものである場合

q 1
w 22
e 333
r 4444

ループを最初に通過した後(charray[0]gets'q'inarray[0]gets 1)、はscanfの「準備完了」を離れgetchar()ますが、これはもちろん失敗します...そして次の;によって「キャッチ」されます。そして、はループを介して3回目に割り当てられます(to )。'\n''w'getchar()"22"inarray[2]

したがって、コードを確認する必要があります。

また、scanf()値を返します。その値を使用する

if (scanf("%d", &inarray[i]) != 1) /* error */;
于 2011-09-30T09:02:50.443 に答える
0

このようにすることができます。

while((c = getchar()) != '\n')
{
    putchar(c);
}

これで問題が解決する場合があります。またはEOFまで行くこともできます。

于 2011-09-30T05:31:50.767 に答える
-1

実際には、文字を使用するのではなく、文字列を配列に直接スキャンする必要がありますscanf("%s",&charray);

while(getchar() != '\n' );ただし、ステートメントを追加すると、コードは機能します。これにより、「\n」までのすべての文字が取得されます。

charray[i] = getchar();
do{
    c = getchar();
}while(c != '\n' && c!= EOF);
printf ("%c\n",charray[i]);
scanf ("%d", &inarray[i]);
do{
    c = getchar();
}while(c != '\n' && c!= EOF);    
printf ("%d\n",inarray[i]);
于 2011-09-30T08:36:29.637 に答える