私が持っているもの:
char cmd[50] = "some text here";
char v[] = {'a','s','d','c','b'};
cmd
からの文字を追加して、v
を連結したいと思います。
明らかに:
strcat(cmd, v[3]);
strcat
はv[n]
パラメータn = int
を受け入れないため、機能しません。
あなたのアプローチの問題。
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でサポートされるすべてのデータ型を追加できることです。
うーん。私が理解している限り、2番目の配列から単一の文字を追加したいですか?だからあなたは使用する必要があります
strncat (cmd, &v[3], 1);
:-)
notを実行してください:
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';