如何连接两个const char *?

时间:2011-12-13 10:06:59

标签: c++

我无法连接两个const char*

我执行以下操作:

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);

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

5 个答案:

答案 0 :(得分:3)

我没有像这样声明他们,但我知道他们有这些信息 所以,我有这个:

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);

这对我有用。

答案 1 :(得分:2)

我更喜欢使用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);

而且您不必在某处解除分配。

答案 2 :(得分:1)

你有char指针,指向无法修改的char常量。你可以做的是将你的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

答案 3 :(得分:1)

我相信你需要为null终止符包含空格,而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);

打印出“Hello,World!”如预期的那样。

至于你在使用参数时看到的错误,我写了一些测试,看看为什么它在使用const局部变量时不会中断。在使用const char *作为目标的指针进行编译时,我得到了这个警告:

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

正如它所述,const被丢弃并且它按预期工作。但是,如果我传递一个const char *指针的参数,那么在尝试修改它写入的缓冲区时会出现总线错误。我怀疑发生了什么,它忽略了参数上的const,但它不能修改缓冲区,因为它在代码中的其他位置被定义为const。

答案 4 :(得分:1)

1

const char* p=new char[strlen(metadata.getRoot())+strlen(metadata.getPath())+1];

长度加1来存储'\ 0'。

2

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

您无法保证args2->fileOrFolderPath的长度比strlen(p)长。

这很好用

#include <iostream>
using namespace std;
void foo(const char*s){
    cout<<s<<endl;
}
int main(int argc,char*argv[]){
    const char* s1 = "hello ";
    const char* s2 = "world!";
    const char* p = new char [strlen(s1)+strlen(s2)+1];
    const char* s = new char [strlen(s1)+strlen(s2)+1];
    strcat(const_cast<char*>(p),s1);
    strcat(const_cast<char*>(p),s2);
    strcpy(const_cast<char*>(s),p);
    cout<<s<<endl;
    foo(s);

    return 0;
}