0

重複の可能性:
C 文字列の連結

C で複数の char 文字列を連結するにはどうすればよいですか?

例:

const char *bytes = "tablr=Hello%20World";
const char *bytes2 = "tablr=Hello%20World";
const char *bytes3 = "tablr=Hello%20World";

ありがとう

4

7 に答える 7

3

Painter の問題を回避するための提案を次に示します。

char const *bytes       = "tablr=Hello%20World";
char const *bytes2      = "tablr=Hello%20World";
char const *bytes3      = "tablr=Hello%20World";

unsigned int const sz1  = strlen(bytes );
unsigned int const sz2  = strlen(bytes2);
unsigned int const sz3  = strlen(bytes3);

char *concat            = (char*)malloc(sz1+sz2+sz3+1);

memcpy( concat         , bytes  , sz1 );
memcpy( concat+sz1     , bytes2 , sz2 );
memcpy( concat+sz1+sz2 , bytes3 , sz3 );
concat[sz1+sz2+sz3] = '\0';

/* don't forget to free(concat) when it's not needed anymore */

これにより、ペインタの問題が回避され、より効率的になります (ただし、そうでない場合もあります)。実装によっては、memcpy がバイト単位または単語単位でコピーする可能性があるためです。

ここでパターンを見ることができれば、char const*[] で提供されている場合、任意の数の文字列を連結する関数に簡単に変換できます。

于 2011-08-30T09:24:26.073 に答える
2

文字列リテラルは、隣接するだけで連結できます。

const char *whole_string = "tablr=Hello%20World" "tablr=Hello%20World" "tablr=Hello%20World";

上記の連結はコンパイラーによって行われ、実行時のオーバーヘッドは発生しません。

于 2011-08-30T08:53:39.333 に答える
2

strcat通常は、 で宣言されている関数を使用します<string.h>

しかし、文字列リテラルを連続して記述するだけで、文字列リテラルを連結できます。例:

const char *p = "Hello, " "World"
 "!";

p は「Hello, World!」を指します。

あなたの場合、次のようになります。

const char* p = 
    "tablr=Hello%20World"
    "tablr=Hello%20World"
    "tablr=Hello%20World";
于 2011-08-30T08:51:27.443 に答える
1

含まれてstring.hいる(簡単ですが「遅い」(実際にはそれほど遅くない; P)方法):

char * result = calloc(strlen(bytes)+strlen(bytes2)+strlen(bytes3)+1,sizeof(char));
strcat(result, bytes);
strcat(result, bytes2);
strcat(result, bytes3);

効率的なループの使用:

int i, j, len = strlen(bytes)+strlen(bytes2)+strlen(bytes3)+1;
char * result = malloc(sizeof(char)*len);
for(i = 0; i < len && bytes[i] != '\0'; i++)
    result[i] = bytes[i];
for(j = 0; i < len && bytes2[j] != '\0'; i++, j++)
    result[i] = bytes2[j];
for(j = 0; i < len && bytes3[j] != '\0'; i++, j++)
    result[i] = bytes3[j];
result[i] = '\0';
于 2011-08-30T08:56:02.323 に答える
0

memcpy関数を使用することをお勧めします。それは非常に効率的です:

int l1 = strlen(bytes), l2 = strlen(bytes2), l3 = strlen(bytes3);
int length = l1+l2+l3;
char *concatenatedBytes = (char *)malloc((length+1)*sizeof(char));
memcpy(concatenatedBytes, bytes, l1);
memcpy(concatenatedBytes + l1, bytes2, l2);
memcpy(concatenatedBytes + l1 + l2, bytes3, l3);
concatenatedBytes[length] = 0;
于 2011-08-30T08:54:46.863 に答える
0

コンパイラがサポートしている場合は、strcat_s または _tcscat_s を使用してください。彼らはあなたが書いているバッファの長さをチェックします。

于 2011-08-30T08:58:09.850 に答える
0

strcatまたはstrncat関数を使用します。ただし、それらの周りのメモリ割り当てには注意してください。

于 2011-08-30T08:51:14.930 に答える