6

作成した単純な関数に特有の問題があります。この関数は、0〜14の乱数を生成し、そのランダムに生成された数値をサイズとして使用して配列を作成し、文字「x」で埋めます。

私が抱えている問題は、関数を呼び出すと、xの後に記号または数字がランダムに表示されることです。

私は当初、配列をサイズ15として宣言していましたが、この表示の問題を引き起こしているのは残りのスロットであると考えました。ただし、機能を変更しても持続します。

現在使用している関数は次のとおりです。

void application()
{
    int randSize, i;

    srand((unsigned)time(NULL));
    randSize = (rand() % 15);

    char array[randSize];
    char *bar = array;

    for(i=0; i< randSize; i++)
            array[i] = 'x';

    printf("%s | ", bar);
}
4

5 に答える 5

6

\0文字列をCで終わらせる必要はありませんか?) 例えば:

char array[randSize + 1];
for (i=0; i < randSize; i++)
   array[i] = 'x';
array[i] = '\0';

(おそらく長さの文字列の有用な部分を取得したかったので、これを更新しました randSize )。

于 2012-10-01T15:59:17.040 に答える
2
printf("%s | ", bar);

%s変換には、0で終了する文字配列へのポインターが必要ですが、配列は0で終了していません。したがって、動作は定義されていませんが、通常はprintf、0バイトが見つかるか、禁止されているメモリに到達するまで文字の読み取りと印刷を続け、セグメンテーション違反を引き起こします。

于 2012-10-01T15:59:35.360 に答える
2

%snullで終了する文字列へのポインタが必要です。あなたはそれを提供していないので、あなたは未定義の振る舞いをしていて、あなたのプログラムは不正な形式です。

フォーマットされたマニュアルをprintf読んで、それがどのように機能し、何を期待するかを確認してください。実際、コードで使用しているすべてのライブラリ関数に対してこれを実行します。やるべきではないことをして、なぜそれがうまくいかないのか疑問に思っても意味がありません。すべての優れたライブラリは、それらの要件の具体的な説明を提供します。

于 2012-10-01T16:00:11.397 に答える
1

printfC文字列を印刷するために使用しています。C文字列はnullで終了する必要があります。

文字列として使用する場合arrayは、追加の文字を割り当て、\0最後にaを追加する必要があります。

char array[randSize + 1];

// loop to fill the array

array[i] = '\0';

nullで終了する文字列を期待しているのでprintf、それがないと、配列の境界を超えて出力を続け、配列の一部ではないメモリを読み取ります。

于 2012-10-01T15:59:29.683 に答える
1

constと宣言されていない限り、これはどのように変数でコンパイルされますか? これは、標準とは見なされない C99 の古い機能です。それ以前は C では許可されておらず、C++ でも機能しません。

char array[randSize];

適切な方法は

char *array = malloc(randSize);

ここで何か不足していますか?

于 2012-10-01T17:11:20.617 に答える