0

重複の可能性:
Cのchar配列を連結します

連結する方法:

char *a="abcd";
char *b="1234";

strcat()を使用しますか?そして、ユーザーが*aと*bを入力したときに同じように答えますか?

EDITはこれを見逃しました:別の配列を使用せずに。

4

6 に答える 6

3

すでに初期化した文字列リテラルをいじることはできません-それらはメモリのどこかに座っていて、書き換えることはできません/すべきではありません。

別の静的に定義された配列は必要ないが、動的割り当ては気にしない場合は、次のコードで目的を達成できます。

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
}

それでも受け入れられない場合は、文字列リテラルを初期化する別の方法を検討してください。

于 2012-05-07T13:46:59.317 に答える
1

連結したいすべてのものを保持するのに十分なスペースがある、宛先の場所を作成する必要があります。

char newchar[50];

strcpy(newchar, a); //per the comment
strcat(newchar, b);
于 2012-05-07T10:11:07.707 に答える
1

別の配列を使用せずに連結する方法

それは無理だ。a と b はどちらも、ROM に常駐する文字列リテラルへの単なるポインタです。データを読み取ることができるメモリが割り当てられていません。

あなたができることはこれです:

char a[9] = "abcd";
const char* b = "1234";
strcat(a, b);

ここでは、'a' を RAM に 9 バイトとして静的に割り当てます。これは、8 シンボル + 文字列終端用の 1 バイトを保持するのに十分な量です。

于 2012-05-07T12:45:26.623 に答える
0

編集:以下の回答は、質問を編集する前のOPの質問に適用されます。

そんなことはできません。ただし、文字列を連結して文字配列にすることはできます。文字配列に連結文字列用の十分なスペースがあることを確認する必要があります。次に例を示します。

char *a = "abcd";
char *b = "1234";
char arr[10] = {0};

strcat(arr, a);
strcat(arr, b);
printf("%s\n", arr);

注: arr[] を 0 で初期化する必要がある理由は、宿題です。:)

于 2012-05-07T10:10:48.957 に答える
0

複数の文字列をコピーする一般的な方法は、十分な大きさのバッファを作成し、最初の文字列をコピーしてから、残りの文字列を 1 つずつ連結することです。ただし、文字列操作にはバグ (セキュリティの抜け穴) がつきものであることが多く、特に注意する必要があります。

この記事を読むことをお勧めします: strlcpy と strlcat - 一貫性があり、安全で、文字列のコピーと連結

OPの編集について編集:

別の配列を使用せずに

そもそも配列がありません。読み取り専用の文字列リテラルへの char 型のポインターがあります。どちらの文字列も変更できません。そうすることで、未定義の動作が呼び出されます。ただし、これらの文字列を読み取って他の文字列にコピーすることはできます (スタックまたはヒープのメモリを所有しているため、変更できます)。

于 2012-05-07T10:16:20.063 に答える
-2

次の関数が機能するはずだと思います

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';
}
于 2012-05-07T10:59:32.830 に答える