类型" const char **"的论证与#34; const char *"类型的参数不兼容

时间:2015-07-09 12:32:37

标签: c++

我使用此代码收到此错误:

string folder;
getline(cin, folder);

string folder2 = folder + "/index.txt";
const char* oldhtml[] = { folder2.c_str() };
folder2 = folder + "/index.html";
const char* newhtml[] = { folder2.c_str()};
rename(oldhtml, newhtml);

错误发生在:rename(oldhtml, newhtml);

我是C ++的新手。所以,如果这是一个简单的修复我道歉

3 个答案:

答案 0 :(得分:12)

您似乎不明白这一行:

const char* oldhtml[] = { folder2.c_str() };

声明一个长度为1的数组。数组元素是一个用folder2.c_str()结果初始化的指针(可能指向字符串的内部存储空间)。

但是,您可以在下一行更改folder2。这会使以前调用c_str的结果无效,因此oldhtml[0]现在是一个悬空指针。

编写此代码的更好方法是始终使用string

string oldhtml = folder + "/index.txt";
string newhtml = folder + "/index.html";
rename(oldhtml.c_str(), newhtml.c_str());

答案 1 :(得分:1)

const char* oldhtml[]创建一个char*数组(类似于const char**),基本上是一个字符串数组(很多char *),当你想要一个字符串(一个且只有一个{ {1}})。

要创建常规指针,请使用:

char*const char* oldhtml

答案 2 :(得分:-1)

改为使用const char* oldhtml = folder2.c_str():无需拥有const char*数组

请注意,oldhtml只有folder2在范围内并且保持不变才有效。哪个不是。你以后修改它。的轰!

顺便说一句,如果rename更改了输入参数,那么程序行为将是未定义的。