2

行列(D * D)を作成するために使用される数値を入力するようにユーザーに要求するだけのコードをCで記述しようとしています。次に、文字を挿入してから印刷します。

これは私が書いたものです:

int d; //matrix size
int i,k; // used for the loops
char **mat; // pointer to a pointer to char

printf("\nenter matrix size\n"); // size of the X*X matrix
scanf("%d",&d);

mat=(char **)malloc(d*sizeof(char *));

for (i=0;i<d;i++)
    mat[i]=(char *)malloc(d*sizeof(char));


printf("enter %d strings with length %d\n",d,d);

for (i=0;i<d;i++)
    for (k=1;k<=d;k++)
    mat[i][k]=getchar();

for (i=0;i<d;i++)
        for (k=0;k<d;k++)
        printf("%c",mat[i][k]);

--d = 3と入力すると、異常終了して無限ループに入ります。たとえば、5と入力すると、4文字ではなく4文字を入力するのに3回しか表示されません。

ありがとうppl!

4

2 に答える 2

2

これは配列の終わりを超えており、未定義の動作になります。

for (i=0;i<d;i++)
    for (k=1;k<=d;k++)       /* this terminating condition */
        mat[i][k]=getchar(); 

k読み取り中の配列の最初の文字をスキップするため、0 から始まる理由がわかりません。への変更:;

for (i=0;i<d;i++)
    for (k=0;k<d;k++)
        mat[i][k]=getchar(); 

の戻り値のキャストmalloc()は不要であり (「malloc の結果をキャストしますか? 」を参照)、は 1 であることが保証されていることに注意してください。変数が実際に割り当てられていることを確認するために、sizeof(char)常に入力操作の結果をチェックしてください。scanf()

if (1 == scanf("%d",&d))
{
    mat = malloc(d * sizeof(char*));
    if (mat)
    {
        /* ... */
    }
}

stdin次元の入力の結果として入力された改行文字はstdin、 の呼び出し後もに残ることに注意してくださいscanf()getchar()後続の呼び出しに干渉しないように、これをスキップする必要があります。行末までスキップするには:

int ch; /* Note that getchar() returns an int, not a char */
while ((ch = getchar()) != '\n' && ch != EOF);

ユーザーが改行文字で入力されている文字列を終了している場合は、文字列を読み取るときにそれをスキップする必要もあります。

for (i=0;i<d;i++)
{
    for (k=0;k<d;k++)
    {
        int ch = getchar();
        if (EOF == ch)
        {
            fprintf(stderr, "Failed to read stdin");
            break;
        }
        mat[i][k]= (char) ch;
    }
    while ((ch = getchar()) != '\n' && ch != EOF);
}
于 2012-10-23T14:24:16.030 に答える
0

私はubuntuでgccを使用して環境で試しました.End Line Charactedで直面した唯一の問題は、ユーザーが文字を入力するとEnterキーを押すため、getcharを使用してマトリックス文字値をユーザーに尋ねると画像になりますその次の値は、標準入力の \n バッファーの結果として要求され、2 番目の入力文字になります。この結果、2 を入力すると、4 ではなく 2 のみの行列エントリを要求するプログラムになります。そのためには、次のことができます。お気に入り:

for (i = 0; i < d i++)
{
   for ( k = 0; k < d; k++)
   {
        getchar();
        mat[i][k] = getchar();
   }

}

k の for ループを参照してください。そのようであるべきです。あなたの場合、正しくない k <= d を使用して存在しないメモリにアクセスしています

于 2012-10-23T15:37:52.380 に答える