如何将 char* 连接或复制在一起?
char* totalLine;
const char* line1 = "hello";
const char* line2 = "world";
strcpy(totalLine,line1);
strcat(totalLine,line2);
此代码会产生错误!
segmentation fault
我猜我需要为totalLine分配内存?
还有一个问题是下面这个是复制内存还是复制数据?
char* totalLine;
const char* line1 = "hello";
totalLine = line1;
提前致谢! :)
我猜我需要为totalLine分配内存?
是的,你猜对了。
totalLine
是一个未初始化的指针,因此那些 strcpy
调用正在尝试写入内存中的随机位置。
幸运的是,由于您已经标记了此 C++,因此您无需担心所有这些。只需这样做:
#include <string>
std::string line1 = "hello";
std::string line2 = "world";
std::string totalLine = line1 + line2;
无需内存管理。
下面是复制内存还是复制数据?
我认为你的意思是“复制了底层字符串,还是只是复制了指针?”。如果是这样,那么只是指针。
是的,你需要给
totalLine
分配内存。在 C 语言中,你有多种不同程度的尴尬选择。我的首选方式需要 GNU 库扩展 asprintf
(也可在 BSD 上使用,但不包含在 POSIX 中):
char *xconcat2(const char *line1, const char *line2) {
char *totalLine;
int len = asprintf(&totalLine, "%s%s", line1, line2);
if (len < 0) abort();
return totalLine;
}
我更喜欢这样做,因为它紧凑、易于阅读且易于修改。不过,如果您需要遵守严格的 ISO C,我认为下一个最好的办法是编写一系列
strlen
和 memcpy
操作。我根本不喜欢使用 strcpy
、strncpy
、strcat
或 strncat
,因为很容易与 strcat
和 strncat
意外地成为二次方,因为很难成为确保它们没有 缓冲区溢出 错误,并且因为
strncpy
和 strncat
没有做你可能期望它们做的事情。
char *xconcat2_iso(const char *line1, const char *line2) {
size_t len1 = strlen(line1);
size_t len2 = strlen(line2);
char *totalLine = malloc(len1 + len2 + 1);
if (!totalLine) abort();
memcpy(totalLine, line1, len1);
memcpy(totalLine + len1, line2, len2);
totalLine[len1 + len2] = '\0';
return totalLine;
}
在 C++ 中,按照已接受答案中的建议,只需使用
std::string
。
totalLine
有垃圾价值
const char* Line1{ "Hallo" };
const char* Line2{ "World" };
char* TotalLine{ new char[strlen(Line1) + strlen(Line2) + 1] };
TotalLine = strcpy(TotalLine, Line1);
TotalLine = strcat(TotalLine, Line2);
注意=>如果您使用 Visual Studio,则需要
#define _CRT_SECURE_NO_WARNINGS
将“aaa”和“bbb”集中到“aaabbb”:
#include <iostream>
#include <cstring>
using namespace std;
int main() {
const char* Line1 ="aaa";
const char* Line2 ="bbb";
char* TotalLine{ new char[strlen(Line1) + strlen(Line2) + 1] };
TotalLine = strcpy(TotalLine, Line1);
TotalLine = strcat(TotalLine, Line2);
cout << TotalLine <<endl;
}