-2

最初の文字列を含む 2 番目の文字列なしで 2 つの文字列を作成する方法はありますか?

私は現在これを持っています

char * s = "Generic String";
char foo[1];
memcpy(foo, s, 1);
char bar[2];
memcpy(bar, s, 2);
printf("%s %s\n", foo, bar);

G GeGを出力します

明らかに、G Geを印刷したいと思います。

4

3 に答える 3

2

C のすべての文字列には、エンド マーカー、つまりヌル文字が必要です。

だからコード

char foo[1];

する必要があります

char foo[2];

に続く

foo[0] = s[0];
foo[1] = 0;

もう一方についても同様です。

すなわち

char bar[3];
memcpy(bar, s, 2); /* As you prefer */
bar[2] = 0; /* To terminate the string */
于 2013-04-20T21:12:05.550 に答える
1

文字列を NUL で終了する必要があります。現在、プログラムは未定義の動作を呼び出します。また、文字列リテラルから初期化するときにconst char *orを使用しないchar []と、const の正確性が損なわれます。

const char *s = "Generic String";

char foo[2];
memcpy(foo, s, 1);
foo[1] = 0;

char bar[3];
memcpy(bar, s, 2);
bar[2] = 0;

printf("%s %s\n", foo, bar);
于 2013-04-20T21:12:35.600 に答える
0

最後にゼロのない文字列を使用しています。

オプション 1: 印刷幅を制限する:

printf("%*s %*s\n", 1, foo, 2, bar);

オプション 2: 文字列ターミネータ (0) にスペースを割り当てます。

char foo[2];
char bar[3];

memcpy(foo, s, 1);
foo[1] = 0;
memcpy(bar, s, 2);
bar[2] = 0;
于 2013-04-20T21:13:59.523 に答える