11

私が持っているもの:

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

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

明らかに:

strcat(cmd, v[3]);

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

4

7 に答える 7

12

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

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

:-)

于 2012-11-05T09:26:31.603 に答える
9

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

  • 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で追加したものをすべて保持するのに十分なスペースが含まれていることに注意するのはあなたの責任です(ここではそうします)。通常は、文字列の連結を行うために使用するのが最適です。これは、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]);

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

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

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

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

于 2012-11-05T09:26:14.057 に答える
5

これを使用しないでください:

strcat(cmd,&v[3]);

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

strncat(cmd, &v[3], 1);
于 2012-11-05T09:28:48.387 に答える
2

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

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

strncat(cmd,&v[3],1);
于 2012-11-05T09:23:56.107 に答える
1

どうですか

strcat(cmd,&v[3]);
于 2012-11-05T09:22:43.850 に答える
1

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

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

あなたがするので

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

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

于 2012-11-05T09:28:23.650 に答える
1
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';
于 2012-11-05T09:29:19.997 に答える