web-dev-qa-db-ja.com

C文字配列の連結

私が持っているもの:

char cmd[50] = "some text here";
char v[] = {'a','s','d','c','b'};

cmdからの文字を追加して、vを連結したいと思います。

明らかに:

strcat(cmd, v[3]);

strcatv[n]パラメータn = intを受け入れないため、機能しません。

11
redgiun

あなたのアプローチの問題。

  • C文字列は0バイトで終わる必要があります。つまり、_'\0'_文字です。 _""_を使用すると自動的に追加されますが、それ以外の場合は自分で追加する必要があり、すべての文字列関数はその0に依存しています。

  • V配列には文字列ではなく文字が含まれ、strcatは文字列を取ります。

1つの解決策:

_char cmd[50] = "some text here";
char *v[] = {"a","s","d","c","b"};
strcat(cmd,v[3]);
_

これにより、char配列がC文字列へのポインタの配列に変わります。

また、_cmd[]_には、strcatを使用して追加したものを保持するのに十分なスペースが含まれていることに注意してください(ここではこれを行います)。ターゲット配列の合計サイズincludeはnullを終了するため、snprintfを使用して文字列を連結することをお勧めします。そのnullは常にそこに追加されるため、混乱することは困難です。元のchar配列の例:

_char cmd[50] = "some text here";
char buf[50];
char v[] = {'a','s','d','c','b'};
snprintf(buf, sizeof buf, "%s%c", cmd, v[3]);
_

注意:このようなsizeofは、bufが本当に_[]_で宣言された配列である場合にのみ機能します。また、snprintfでは、宛先とフォーマットの両方の引数として同じバッファーを使用すると予期しない結果が生じる可能性があるため、新しい宛先バッファー変数を追加しました。

もう1つのsnprintfの例。元の2つの配列のみを使用して、cmdの現在の内容の最後に追加します。

_snprintf(cmd + strlen(cmd), (sizeof cmd) - strlen(cmd), "%c", v[3]);
_

したがって、この特定のケースでは明らかに、1文字を追加するために他の回答で提案されているstrncat(cmd, &v[3], 1)の方がはるかに優れていますが、snprintfの利点は、charではなく、printfでサポートされるすべてのデータ型を追加できることです。

9
hyde

うーん。私が理解している限り、2番目の配列から単一の文字を追加したいですか?だからあなたは使用する必要があります

  strncat (cmd, &v[3], 1);

:-)

12
MGrant

notを実行してください:

strcat(cmd,&v[3]);

&v[3]はnullで終了する文字列へのポインタではありません!代わりに使用

strncat(cmd, &v[3], 1);
5
iabdalkader

まず、変数「cmd」に十分なメモリが割り当てられていることを確認します。

次に、「v [3]」への言及は、符号付きバイトである値です。次のstrncat(strcatではない)の呼び出しを使用する必要があります。

strncat(cmd,&v[3],1);
2
jondinham

いかがですか

strcat(cmd,&v[3]);
1
user1203650

問題は、strcatも使用しないことです。

char *strcat (char *dest, const char *src);

あなたがするので

char *strcat (char *dest, char src);

したがって、char *をcharとして宣言する必要があります。

1
Atchoum
char buf[2];

sprintf(buf,"%c", V[3]);
strcat(cmd, buf);

または

strncat (cmd, &v[3],1);

あなたはそれを行うことはできません

strcat(cmd,&v[3]);

これにより、V配列がセル3から配列の最後までコピーされ、V [3]のみがコピーされません

別の解決策を提案できます

int len = strlen(cmd);
cmd[len]=v[3];
cmd[len+1] = '\0';
1
MOHAMED