C++ 如何连接两个常量字符*?

C++ 如何连接两个常量字符*?,c++,C++,我无法连接两个常量字符* 我做了以下工作: const char* p = new char[strlen(metadata.getRoot())+strlen(metadata.getPath())]; strcat(const_cast<char*>(p),metadata.getRoot()); strcat(const_cast<char*>(p),metadata.getPath()); strcpy(const_cast<char*>(args2

我无法连接两个
常量字符*

我做了以下工作:

const char* p = new char[strlen(metadata.getRoot())+strlen(metadata.getPath())];
strcat(const_cast<char*>(p),metadata.getRoot());
strcat(const_cast<char*>(p),metadata.getPath());

strcpy(const_cast<char*>(args2->fileOrFolderPath),p);

function(args2->fileOrFolderPath);
const char*p=new char[strlen(metadata.getRoot())+strlen(metadata.getPath())];
strcat(const_cast(p),metadata.getRoot();
strcat(const_cast(p),metadata.getPath();
strcpy(const_cast(args2->fileOrFolderPath),p);
函数(args2->fileOrFolderPath);

现在,当我在控制台上打印变量
args2->fileOrFolderPath
时,会出现正确的输出。。。但当我调用一个以变量为参数的方法,并使用变量时,我得到了一个分段错误。有什么问题吗?

您有字符指针,指向无法修改的字符常量。您可以做的是将const char数组复制到某个char数组中,并执行以下操作以合并const字符串:

char result[MAX];   

strcpy(result,some_char_array); // copy to result array 
strcat(result,another_char_array); // concat to result array

我认为您需要为空终止符包含空间,
strcat
的第一个参数不应该是
const
,因为您正试图修改指向的内存

您希望执行以下操作:

char * str1 = "Hello, ";
char * str2 = "World!\n";

char * buffer = malloc(strlen(str1) + strlen(str2) + 1);

strcpy(buffer, str1);
strcat(buffer, str2);

printf(buffer);
按预期打印出“你好,世界!”

至于您在使用参数时看到的错误,我已经编写了一些测试,以了解为什么在使用const局部变量时它不会中断。使用
const char*
为我用作目标的指针编译时,我收到以下警告:

./strings.c:10: warning: passing argument 1 of ‘strcat’ discards qualifiers from pointer target type

正如它所说的,const被丢弃,并按预期工作。但是,如果我传递的参数是
const char*
指针,那么在试图修改它写入的缓冲区时,会出现总线错误。我怀疑发生的情况是它忽略了参数上的常量,但它无法修改缓冲区,因为它在代码的其他地方被定义为常量。

我更喜欢使用std::string,但是如果您喜欢char*和str。。。函数,至少在使用strcat之前初始化p:

*p = 0;

顺便说一句: 使用std::string,这将是:

std::string p = std::string(metadata.getRoot()) + metadata.getPath();
strcpy(const_cast<char*>(args2->fileOrFolderPath), p.c_str());

function(args2->fileOrFolderPath);
std::string p=std::string(metadata.getRoot())+metadata.getPath();
strcpy(const_cast(args2->fileOrFolderPath),p.c_str();
函数(args2->fileOrFolderPath);
而且您不必在某个地方解除p的分配。

1

const char* p=new char[strlen(metadata.getRoot())+strlen(metadata.getPath())+1];
长度加1存储'\0'

二,


我没有这样申报,但我知道他们有这些信息 所以,我有这个:

const char* ruta1 = "C:\\Users\\Deivid\\Desktop\\";
const char* ruta2 = "lenaGris.xls";
然后我将其用于连接:

char * RutaFinal = new char[strlen(ruta1) + strlen(ruta2) + 1];
strcpy(RutaFinal, ruta1);
strcat(RutaFinal, ruta2);

printf(RutaFinal);

这对我很有用。

你是通过价值观还是参考价值观?你试过用p来调用它吗?你为什么要用
constchar*
呢?首先,您应该使用
std::string
std::vector
,其次,当您最终需要它时,您可以始终转换为
const char*
。顺便说一句,您的代码有内存泄漏,因为您没有释放
p
。分配
p
似乎毫无意义。无论如何,您不妨直接将字符串构建到
args2->fileOrFolderPath
指向的内存中。如果它足够长,你似乎没有检查。使用
std::string
的原因是为了保存处理这种事情的代码页。@Tobi:strcpy开始写入结果的第一个字符。STRCAT搜索第一个空字符的出现,所以如果你想使用STRCAT,你必须先初始化结果。你不应该使用“CalLoc”还是先把“STRCAT”改为“StrucY”?这不是C++(MALOC)。Show C++@Tobi Weißhaar是的,dest缓冲区不能是常量,因为您正在更改它。args2->fileOrFolderPath是什么?你有足够的内存吗?我解决了这个问题:char*p=new char[strlen(metadata.getRoot())+strlen(metadata.getPath())+1];strcat(p,metadata.getRoot());strcat(p,metadata.getPath());args2->fileOrFolderPath=p;函数(args2->fileOrFolderPath);在函数中,我删除了变量。@Toby:完全没有理由将p声明为常量,因为您正试图更改它,所以请删除常量,但您确实必须初始化p(通过将其设置为0或在使用strcat之前使用strcpy)。顺便问一下,有什么理由让fileOrFolderPath保持不变吗?@Toby:当你说“这不起作用”时,你是指std::string解决方案吗?
const char* ruta1 = "C:\\Users\\Deivid\\Desktop\\";
const char* ruta2 = "lenaGris.xls";
char * RutaFinal = new char[strlen(ruta1) + strlen(ruta2) + 1];
strcpy(RutaFinal, ruta1);
strcat(RutaFinal, ruta2);

printf(RutaFinal);