私が持っているもの:
char cmd[50] = "some text here";
char v[] = {'a','s','d','c','b'};
cmd
だから私はからの文字を追加して連結したいと思いv
ます。
明らかに:
strcat(cmd, v[3]);
パラメータstrcat
を受け入れないため、機能しません。v[n]
n = int
私が持っているもの:
char cmd[50] = "some text here";
char v[] = {'a','s','d','c','b'};
cmd
だから私はからの文字を追加して連結したいと思いv
ます。
明らかに:
strcat(cmd, v[3]);
パラメータstrcat
を受け入れないため、機能しません。v[n]
n = int
うーん。私が理解している限り、2番目の配列から1つの文字を追加したいですか?だからあなたは使用する必要があります
strncat (cmd, &v[3], 1);
:-)
あなたのアプローチの問題。
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でサポートされるすべてのデータ型を追加できることです。
これを使用しないでください:
strcat(cmd,&v[3]);
&v[3]
nullで終了する文字列へのポインタではありません!代わりに使用する
strncat(cmd, &v[3], 1);
まず、変数'cmd'に十分なメモリが割り当てられていることを確認します。
次に、「v [3]」への言及は、符号付きバイトである値です。次のstrncatの呼び出し(strcatではない)を使用する必要があります。
strncat(cmd,&v[3],1);
どうですか
strcat(cmd,&v[3]);
問題は、strcatも使用しないことです。
char *strcat (char *dest, const char *src);
あなたがするので
char *strcat (char *dest, char src);
したがって、char*をcharとして宣言する必要があります。
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';