在没有额外缓冲区的情况下执行此操作
事实上,最直接的方法是避免复制:
#include <string.h>
#include <stdio.h>
int main() {
char a[] = "abcde";
char b[] = "xyz";
printf("%s%s\n", a, b);
return 0;
}
用 memcpy 做
memcpy将n
字节从复制src
到dest
。您需要自己正确跟踪复制字符串的空终止字节。
#include <string.h>
#include <stdio.h>
int main() {
char a[] = "abcde";
char b[] = "xyz";
/* note that both strings add a '\0' termination */
char c[sizeof(a) + sizeof(b) - 1];
/* copy the content of a to c */
memcpy(c, a, sizeof(a));
/* copy the content of b to where a ends (concatenate the strings) */
memcpy(c + sizeof(a) - 1, b, sizeof(b));
/* note that the '\0' termination of the string is necessary to let
* functions like printf know where the string is over
*/
printf(c);
return 0;
}
用 strcpy 和 strcat 做
请注意,在使用 memcpy 时,正确处理字符串的空终止存在很多缺陷。要简化字符串的此过程,您应该执行以下操作。
如果这些确实是字符串而不是随机字节,您应该坚持使用标准库的字符串函数。这就是它的完成方式。
#include <string.h>
#include <stdio.h>
int main() {
char a[] = "abcde";
char b[] = "xyz";
/* note that both strings add a '\0' termination */
char c[sizeof(a) + sizeof(b) - 1];
/* copy the content of a to c */
strcpy(c, a);
/* copy the content of b to where a ends (concatenate the strings) */
strcat(c, b);
/* note that the '\0' termination of the string is necessary to let
* functions like printf know where the string is over
*/
printf(c);
return 0;
}
关于知道字符串的大小
关于知道缓冲区的大小,请注意您通常不能简单地做sizeof(a_string)
. 如果将字符数组传递给函数,它会衰减为指针,并且此操作不再返回数组的预期大小,而是指针的大小。
对于字符串,您需要发出strlen(a_string)
which 扫描空终止的出现并返回字符串的长度(不包括终止)。
至于包含随机数据的字符缓冲区(或需要写入的空缓冲区),这种方法也不起作用。您总是需要将缓冲区的大小作为附加参数传递。