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

问题描述 投票:0回答:4

如何将 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;

提前致谢! :)

c++ strcpy strcat
4个回答
15
投票

我猜我需要为totalLine分配内存?

是的,你猜对了。

totalLine
是一个未初始化的指针,因此那些
strcpy
调用正在尝试写入内存中的随机位置。

幸运的是,由于您已经标记了此 C++,因此您无需担心所有这些。只需这样做:

#include <string>

std::string line1 = "hello";
std::string line2 = "world";

std::string totalLine = line1 + line2;

无需内存管理。

下面是复制内存还是复制数据?

我认为你的意思是“复制了底层字符串,还是只是复制了指针?”。如果是这样,那么只是指针。


9
投票

是的,你需要给

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


1
投票

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


0
投票

将“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;
}
© www.soinside.com 2019 - 2024. All rights reserved.