如何复制或连接两个字符*

How to copy or concatenate two char*

本文关键字:两个 字符 何复制 复制 连接      更新时间:2023-10-16

如何将字符*连接或复制在一起?

char* totalLine;
const char* line1 = "hello";
const char* line2 = "world";
strcpy(totalLine,line1);
strcat(totalLine,line2);

此代码产生错误!

segmentation fault

我猜我需要为总行分配内存?

另一个问题是,以下是复制内存还是复制数据?

char* totalLine;
const char* line1 = "hello";
 totalLine = line1;

提前感谢! :)

我猜我需要为总行分配内存?

是的,你猜对了。 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,在我看来,下一个最好的办法是写出一系列strlenmemcpy操作。 我根本不喜欢使用strcpystrncpystrcatstrncat,因为很容易意外地与strcatstrncat二次,因为很难确定你没有缓冲区溢出错误,而且因为strncpystrncat没有做你可能期望它们做的事情。

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] = '';
    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;
}