重複の可能性:
C 文字列の連結
C で複数の char 文字列を連結するにはどうすればよいですか?
例:
const char *bytes = "tablr=Hello%20World";
const char *bytes2 = "tablr=Hello%20World";
const char *bytes3 = "tablr=Hello%20World";
ありがとう
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*[] で提供されている場合、任意の数の文字列を連結する関数に簡単に変換できます。
文字列リテラルは、隣接するだけで連結できます。
const char *whole_string = "tablr=Hello%20World" "tablr=Hello%20World" "tablr=Hello%20World";
上記の連結はコンパイラーによって行われ、実行時のオーバーヘッドは発生しません。
strcat
通常は、 で宣言されている関数を使用します<string.h>
。
しかし、文字列リテラルを連続して記述するだけで、文字列リテラルを連結できます。例:
const char *p = "Hello, " "World"
"!";
p は「Hello, World!」を指します。
あなたの場合、次のようになります。
const char* p =
"tablr=Hello%20World"
"tablr=Hello%20World"
"tablr=Hello%20World";
含まれて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';
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;
コンパイラがサポートしている場合は、strcat_s または _tcscat_s を使用してください。彼らはあなたが書いているバッファの長さをチェックします。
strcat
またはstrncat
関数を使用します。ただし、それらの周りのメモリ割り当てには注意してください。