44
#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[]) {
    char string[] = "october"; // 7 letters

    strcpy(string, "september"); // 9 letters

    printf("the size of %s is %d and the length is %d\n\n", string,
        sizeof(string), strlen(string));

    return 0;
}

出力:

$ ./a.out
the size of september is 8 and the length is 9

私の構文に何か問題がありますか?

4

4 に答える 4

41

sizeofそしてstrlen()、さまざまなことをします。この場合、あなたの宣言

char string[] = "october";

と同じです

char string[8] = "october";

そのため、コンパイラは のサイズstringが 8 であることを認識できます。これはコンパイル時に行われます。

ただし、strlen()実行時に文字列内の文字数をカウントします。そのため、 を呼び出した後、 にstrcpy()string"september" が含まれるようになりました。 strlen()は文字を数え、そのうちの 9 つを見つけます。string「september」を保持するのに十分なスペースが割り当てられていないことに注意してください。これは未定義の動作です。

于 2012-03-30T04:59:26.673 に答える
2

出力は正しいため、

最初のステートメント文字列のサイズは、7 + 1 であるコンパイラによって割り当てられました (10 月は、コンパイル時に 7 バイトと null ターミネータの 1 バイトです)。

2 番目のステートメント: 9 月 (9 バイトから 8 バイトの文字列) をコピーしています。

そこで、9 月のサイズを 8 バイトとして取得しました (まだstrlen()9 月には機能しません。null 文字はありません)。

于 2012-03-30T05:05:49.983 に答える
1

宛先配列は 8 バイト (「10 月」の長さ + \0) で、その配列に 9 文字を入れたいとします。

man strcpy発言: strcpy() の宛先文字列が十分に大きくない場合、何かが起こる可能性があります。

本当にやりたいことを教えてください ずっと臭いから

于 2012-03-30T04:57:06.317 に答える
-1

この例では、バッファ オーバーフローの問題を解消する必要があります。これを行う1つの方法は、次を使用することstrncpyです:

memset(string, 0, sizeof(string));
strncpy(string, "september", sizeof(string)-1);
于 2012-03-30T08:24:42.547 に答える