1

以下に示すコードがあります。最後のステートメントは、l_plates[i] を使用した場合にのみ機能します。以下の場合、「'sprintf' の引数 1 を渡すと、キャストなしで整数からポインターが作成されます」というエラーがスローされます。sprintf を使用する場合、追加の要素を使用する必要がありますか? 説明してください。前もって感謝します。

char type, letters[4], digits[5];
char l_plates[M][N];

for (i=0; i<M; i++) {
    scanf(" %c", &type);
    scanf("%3s", letters); 
    scanf("%4s", digits); 
    sprintf(l_plates[i][N], "%s %s %c", letters, digits, type);
}
4

5 に答える 5

4

ここには 2 つの問題があります。まず、 sprintf の最初の引数は、送信するものであるchar*ではなく である必要があります。char

次に、サイズの配列にからまでのNインデックスが付けられます。element にアクセスしようとすると、配列の外に出ます。最後の要素は.0N - 1N[N - 1]

于 2013-04-05T01:35:40.363 に答える
0

あなたのsprintf行では、式l_plates[i][N]は単一の文字を参照しており、文字列全体を書き込もうとしています。

変数l_platesは、長さの文字列の 1 次元配列N(または char の 2 次元配列) です。

文字列の 2 次元配列が必要な場合は、次のl_platesように定義する必要があります。

char* l_plates[M][N];

それに応じてそれらの文字列をmallocします。

于 2013-04-05T01:34:45.480 に答える
0

の宣言を見てみましょうl_plates:

char l_plates[M][N];

これは、文字l_platesの配列のN配列であると言いMます。これを考える別の方法は、文字の 2 次元配列です。

では、 の型はl_plates[i][N]何ですか? それはchar!つまり、単一のシンボルです。ただし、最初の引数としてsprintf()a が必要です。char*これが、上記のコードでコンパイラ エラーが発生する理由です。

一方、sl_plates[i]配列ですchar。C と C++ はどちらもこの配列を に変換できるchar*ため、コンパイラは文句を言いません。

于 2013-04-05T01:36:42.583 に答える
0

これl_plates[i]は、 が文字列であるのに対し、は範囲外の文字ではありますが (が最後の文字であるl_plates[i][N]ため)、単一の文字であるためです。N-1

そうは言っても、次のほうがよいかもしれませんsnprintf()

snprintf(l_plates[i], N, "%s %s %c", letters, digits, type);

これにより、文字配列がオーバーフローしないようになります。

于 2013-04-05T01:37:12.837 に答える
0

C でポインターと配列がどのように機能するかを調べる必要があります。

l_plates[i][N]実際には a を参照するためchar、コンパイルさえしません。sprintf はchar*、出力を書き込む場所を想定しています。内部配列の先頭を指すl_plates[i]型 を持ちchar[N]、暗黙的に に変換可能です。char*それを引数として sprintf に与えると、おそらくあなたが望むことを実行します。

ちなみに、l_plates[i][N]不正なオフセットで内部配列にアクセスしています。サイズ N の配列へのオフセットは、0 から N-1 の間である必要があります。C/C++ は実行時にこれについて文句を言うとは限りませんが、ほとんどの場合バグです。この場合l_plates[M-1][N]、 do は に割り当てられたメモリの外側を指しl_platesます。

于 2013-04-05T01:43:19.440 に答える