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*?