我无法连接两个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
时,会出现正确的输出...但是当我用变量作为参数调用方法时,使用变量然后我得到了一个分段错误。有什么问题?
答案 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;
}