【问题标题】:Argument of type "const char **" is incompatible with parameter of type "const char *"“const char **”类型的参数与“const char *”类型的参数不兼容
【发布时间】:2015-07-09 12:32:37
【问题描述】:

我收到此代码的错误:

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++ 还很陌生。因此,如果这是一个简单的解决方法,我深表歉意

【问题讨论】:

标签: c++


【解决方案1】:

这行好像你没看懂:

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

【讨论】:

    【解决方案2】:

    const char* oldhtml[] 创建一个char* 数组(类似于const char**),基本上是一个字符串数组(许多字符*),当您需要一个字符串(一个且只有一个char*)时。

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

    const char* oldhtmlconst char oldhtml[]

    【讨论】:

    • 实际上它创建了一个const char * []。数组和指针是不同的。
    • @MattMcNabb,运行时数组和指针是完全可以互换的(除了delete[]
    • @WorldSEnder 没有。 See here 进行讨论,或阅读 C 常见问题解答(或 C++ 常见问题解答)。
    • @MattMcNabb,这个问题是针对编译时静态数组,而不是运行时数组
    【解决方案3】:

    改用const char* oldhtml = folder2.c_str():不需要const char*的数组

    请注意,oldhtml 仅在 folder2 在范围内且保持不变时才有效。哪个不是。你稍后修改它。 轰隆隆!

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

    【讨论】:

    • 想必是标准C++函数std::rename(char const *old_filename, char const *new_filename);
    猜你喜欢
    • 2019-12-16
    • 2016-05-19
    • 2020-01-20
    • 1970-01-01
    • 1970-01-01
    • 2021-08-06
    • 2020-11-19
    • 2014-07-03
    • 1970-01-01
    相关资源
    最近更新 更多