2

「ユーザーが最大 20 個の整数を入力できるようにする C プログラムを作成する (センチネル値に基づいて、または 20 個の整数制限に達したことに基づいて、数値の受け入れを停止します)」という課題があります。その後、プログラムは数値を表示する必要があります。エントリーの逆順です。」

センチネル値を "EOF" (または CTRL+D / CRTL+Z) にすることにしました。私のコードには、いくつかの非常に不安定な動作があります。

  1. EOF キーを 2 回押す必要があります (これにより、配列にカウントされる空白のエントリも作成されます。
  2. 最初のエントリの最初の桁が切り捨てられます。

他のすべては正常に動作しているように見えますが、これは明らかに望ましい結果ではありません。以下は私のコードです。何が悪いのか説明できますか?

main() {
int i,iMax;
double dblMean;
int x[MAX];

printf("Please Enter Up to 20 Integers\n");

for (i=0; i<MAX; i++)
{
    printf("%d.> ",i+1);
    if (getchar() == EOF)           /* Check for CTRL+D OR CTRL+Z */
    break;                          /* Exit loop if EOF entered :: Must be pressed twice and eats first character of first entry */
    scanf("%d",&x[i]);
    iMax=i;
}

printf("\nYou entered  %d numbers\n",iMax+1);               /* Should be i+1 but EOF had to be entered twice */
printf("\nIndex       Item        Reverse Item\n");
for (i=0; i<=iMax; i++)
    printf("%3d%4c%8d%9c%11d\n",i,'  ',x[i],'  ',x[iMax-i]);
return 0;

}

編集済み:これが私の最終的なコードです。ご協力いただきありがとうございます:

#include <stdio.h>
#include <stdlib.h>
#define MAX 20
int main()
{
    int i,iMax;
    int x[MAX];

    printf("Please Enter Up to 20 Integers\n");

    for (i=0; i<MAX; i++)
    {
        printf("%d.> ",i+1);
        if (scanf("%d",&x[i]) != 1)                         /* Checks for CTRL+D OR CTRL+Z */
        break;                                              /* EOF returns -1 and loop will be exited */
        iMax=i;                                             /* iMax must be set for second loop to exit properly */
                                                            /* Can sizeof x be used instead for second loop? */
    }

    printf("\nYou entered  %d numbers\n",iMax+1);           /* Displays number of items entered... Will be <= MAX*/
    printf("\nIndex       Item        Reverse Item\n");
    for (i=0; i<=iMax; i++)                                 /* Why wont 'for (i=0; i<=sizeof x; i++)' work? */
        printf("%3d%4c%8d%9c%11d\n",i,'  ',x[i],'  ',x[iMax-i]);
    return 0;
}
4

2 に答える 2

1

このgetchar()呼び出しは、EOF ではないため、最初の数字を読み取ります (事実上破棄します)。

機能するかどうかはテストしませんscanf()。あなたがすべき。

for (i = 0; i < MAX; i++)
{
    if (scanf("%d", &x[i]) != 1)
        break;
}

この時点iで、配列には整数があります。iMaxループに設定する必要はありません。ループの終了時に簡単に設定できます。

于 2012-10-22T05:08:41.697 に答える
0

また、scanf の確認に加えて、知っておくべきことは次のとおりです。

EOF は文字ではありません。EOF は、 getchar() が入力の終わりに到達したとき、または何らかのエラーに遭遇したときに返すマクロです。^D は「EOF 文字」ではありません。行で ^D を単独で押すと、Linux で何が起こっているかというと、ストリームが閉じられ、getchar() 呼び出しが入力の最後に到達し、EOF マクロが返されます。行の途中で ^D を入力すると、ストリームは閉じられないため、 getchar() は読み取った値を返し、ループは終了しません。

適切な説明については、http://www.c-faq.com/stdio/getcharc.htmlを参照してください。

于 2012-10-22T05:42:08.007 に答える