c++ 我想 concat char 但我得到一个分段错误

Posted

技术标签:

【中文标题】c++ 我想 concat char 但我得到一个分段错误【英文标题】:c++ i want to concat char but i get an segmentation fault 【发布时间】:2015-07-07 20:04:01 【问题描述】:

我有一个简短的问题,我如何在 C++ 中连接这些字符。我总是遇到分段错误

struct dirent *ent
const char *filePath = strcat("/test/",ent->d_name) ;

【问题讨论】:

您希望将连接的字符串准确地存储在哪里?你还没有为它分配任何空间。另外,我假设有一些您没有向我们展示的代码使ent 有效,否则您在初始化它之前就使用它。 你为什么用const char*而不是std::string yes ent is init befor 但我不能使用字符串,因为我需要一个 const char 这就是.c_str() 函数的用途。 (另外,这让人觉得你没有问你真正的问题。) 【参考方案1】:

连接字符串的C方式是这样的:

char buf[128];
strcpy(buf, "first string");
strcat(buf, "second string");

首先我们分配空间来保存连接的字符串。然后我们将第一个字符串复制到缓冲区中。然后我们将第二个字符串连接到第一个字符串上。

但由于您使用的是 C++,因此您确实应该使用 std::string 而不是 str* 函数。

std::string j = "hello";
j += " there";

【讨论】:

然后要获得const char*,只需使用j.c_str()【参考方案2】:

你读过documentation吗?

将 src 指向的字符串的副本附加到 dest 指向的字符串的末尾。字符 src[0] 替换了 dest 末尾的空终止符。生成的字节字符串以 null 结尾。

如果目标数组对于 src 和 dest 的内容以及终止空字符都不够大,则行为未定义。

"/test/" 首先是不可修改的字符数组,更不用说“足够大以容纳 src 和 dest 的内容以及终止空字符”。

如果您启用了足够高的编译器警告级别,编译器还会告诉您有关在预期传递 char* 的地方传递 const char[] 的信息。

【讨论】:

【参考方案3】:
struct dirent *ent
const char *filePath = strcat("/test/",ent->d_name) ;

我发现 std::stringstream 更加灵活:

std::stringstream filePathSS;

// streams know how to handle c-style nullterminated
filePathSS << "/test/" << ent->d_name

// and numbers
           << "_" << i++   // to create a unique file each use

// and std::string
           << "." << suffix; // append a const std::string

通过以下方式访问 const char* 很简单:

const char* filePath = filePathSS.str().c_str();

【讨论】:

以上是关于c++ 我想 concat char 但我得到一个分段错误的主要内容,如果未能解决你的问题,请参考以下文章

如何将 python ndarray 转换为 c++ char*?

在 C++ 中合理地初始化 char 数组?

在 C++ 中切片 char 数组(python 到 c++)

C++:如何构建字符串/字符*

在 C++ 中将字节写入 ofstream

C++ REG_SZ 到 char* 并在没有提升权限的情况下读取 HKLM