最初の文字列を含む 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を印刷したいと思います。
最初の文字列を含む 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を印刷したいと思います。
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 */
文字列を 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);
最後にゼロのない文字列を使用しています。
オプション 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;