0

char 配列に ip を割り当て、それが正しいことを確認するために出力し、次の結果が得られました。

int
main(void)
{
    char ip [11] = "65.55.57.27";
    printf(ip);
    return 0;
}

私は得る

65.55.57.270 "

しかし、配列サイズを 12 に増やすと

int
main(void)
{
    char ip [12] = "65.55.57.27";
    printf(ip);
    return 0;
}

私は得る

65.55.57.27

誰でもこれを説明できますか?サイズ 11 の配列が 13 文字の結果を返し、サイズ 12 の配列が 11 文字の結果を返すのはなぜですか?

4

2 に答える 2

5

の配列

char ip [11] = "65.55.57.27";

文字列リテラルの長さはちょうど 11 文字であるため、 NUL ターミネータ用のスペースがありません。

これにより、

printf(ip);

未定義の動作を持つ。

次のいずれかで問題が解決します。

char ip [12] = "65.55.57.27";
char ip [] = "65.55.57.27";
于 2013-03-28T16:18:47.393 に答える
1

\011 バイトのスペースを作成しましたが、char 配列には暗黙の null バイトも存在します。

>> ip

   {'6', '5', '.', '5', '5', '.', '5', '7', '.', '2', '7', '\0'}

したがって、配列には12個の要素があり、サイズに対して1つ多すぎます。コンパイラでエラーが発生するはずです。これは私が得たものです:

error: initializer-string for char array is too long

私はこれらの些細な問題に対処するのは好きではありません。それが私が使用する理由ですstd::string

#include <string>
#include <iostream>

int main()
{
    std::string str = "65.55.57.27";

    std::cout << str;
}

ライブデモ

于 2013-03-28T16:20:35.667 に答える