重複の可能性:
Cのchar配列を連結します
連結する方法:
char *a="abcd";
char *b="1234";
strcat()を使用しますか?そして、ユーザーが*aと*bを入力したときに同じように答えますか?
EDITはこれを見逃しました:別の配列を使用せずに。
重複の可能性:
Cのchar配列を連結します
連結する方法:
char *a="abcd";
char *b="1234";
strcat()を使用しますか?そして、ユーザーが*aと*bを入力したときに同じように答えますか?
EDITはこれを見逃しました:別の配列を使用せずに。
すでに初期化した文字列リテラルをいじることはできません-それらはメモリのどこかに座っていて、書き換えることはできません/すべきではありません。
別の静的に定義された配列は必要ないが、動的割り当ては気にしない場合は、次のコードで目的を達成できます。
char *a = "abcd";
char *b = "1234";
char *out;
if((out = (char *)malloc(strlen(a) + strlen(b) + 1)) != NULL)
{
strcpy(out, a);
strcat(out, b);
}
else
{
//you don't have enough memory, handle it
}
それでも受け入れられない場合は、文字列リテラルを初期化する別の方法を検討してください。
連結したいすべてのものを保持するのに十分なスペースがある、宛先の場所を作成する必要があります。
char newchar[50];
strcpy(newchar, a); //per the comment
strcat(newchar, b);
別の配列を使用せずに連結する方法
それは無理だ。a と b はどちらも、ROM に常駐する文字列リテラルへの単なるポインタです。データを読み取ることができるメモリが割り当てられていません。
あなたができることはこれです:
char a[9] = "abcd";
const char* b = "1234";
strcat(a, b);
ここでは、'a' を RAM に 9 バイトとして静的に割り当てます。これは、8 シンボル + 文字列終端用の 1 バイトを保持するのに十分な量です。
編集:以下の回答は、質問を編集する前のOPの質問に適用されます。
そんなことはできません。ただし、文字列を連結して文字配列にすることはできます。文字配列に連結文字列用の十分なスペースがあることを確認する必要があります。次に例を示します。
char *a = "abcd";
char *b = "1234";
char arr[10] = {0};
strcat(arr, a);
strcat(arr, b);
printf("%s\n", arr);
注: arr[] を 0 で初期化する必要がある理由は、宿題です。:)
複数の文字列をコピーする一般的な方法は、十分な大きさのバッファを作成し、最初の文字列をコピーしてから、残りの文字列を 1 つずつ連結することです。ただし、文字列操作にはバグ (セキュリティの抜け穴) がつきものであることが多く、特に注意する必要があります。
この記事を読むことをお勧めします: strlcpy と strlcat - 一貫性があり、安全で、文字列のコピーと連結
OPの編集について編集:
別の配列を使用せずに
そもそも配列がありません。読み取り専用の文字列リテラルへの char 型のポインターがあります。どちらの文字列も変更できません。そうすることで、未定義の動作が呼び出されます。ただし、これらの文字列を読み取って他の文字列にコピーすることはできます (スタックまたはヒープのメモリを所有しているため、変更できます)。
次の関数が機能するはずだと思います
void stcat (char *str1, char *str2)
{
int i = 0,len = 0;
while(*(str1+len)!='\0')
len++;
while(*(str2+i)!='\0')
{
*(str1+len) = *(str2+i);
i++;
len++;
}
*(str1+len) = '\0';
}