![](/img/trans.png)
[英]Why is main() argument argv of type char*[] rather than const char*[]?
[英]passing const char in argv main argument
我有以下内容:
int main(int argc, char *argv[])
{
char *INPUTFILE_DATABASE = "";
strcpy(INPUTFILE_DATABASE, argv[1]);
if(INPUTFILE_DATABASE[0]=='\0')
{
cout << "No input file given" << endl;
INPUTFILE_DATABASE="File_name.csv";
}
cout << "Input file: " << INPUTFILE_DATABASE << endl;
return 0;
编译时,我收到:
warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
char *INPUTFILE_DATABASE = "";
当我将char *INPUTFILE_DATABASE
设为const char *INPUTFILE_DATABASE
我不能再更改它了,当然不能更改。 我究竟做错了什么? 还是我的动力通常无法以这种方式实现?
最后,我只想允许更改输入文件名,但是当没有给出文件名时,应使用标准文件名。
您永远都无法更改它。 就是这样,由于使用了旧的C规则,因此您看起来可以。 规则的更改(在C ++ 98中已弃用;实际上,由于C ++ 11而已,这是非法的,不会编译)是为了更好地提醒您这一点。
要更改字符串,请将其复制到您拥有的东西上,最好使用std::string
,尤其是由于您对C字符串的掌握似乎并不十分强大(您尝试复制的长度为零的字符串)可能是非零长度的字符串!)。
实际上,我不会复制任何内容,但是会重新安排您的逻辑以有条件地初始化INPUTFILE_DATABASE
,而该内容仍然是原始的常量字符串,如下所示:
// Use argv[1] if given and non-empty, otherwise a default path
const char* INPUTFILE_DATABASE = (
argc > 1 && argv[1][0] != '\0'
? argv[1]
: "File_name.csv"
);
是的,您不应该这样做。 代替这个:
char *INPUTFILE_DATABASE = "";
你应该做一些诸如
char INPUTFILE_DATABASE[32]; // or another size that is sufficent
当您执行char *INPUTFILE_DATABASE = "";
时会发生什么? 是您的char*
将指向仅保留""
(因此可能只是程序二进制文件中某个位置的值为0
的字节)。 你不能写信到那里。
另外,由于这是C ++,所以我建议:
std::string INPUTFILE_DATABASE = argv[1];
而不是if(INPUTFILE_DATABASE[0]=='\\0')
您可以执行if (!INPUTFILE_DATABASE.size())
您可以使用std::string
为您管理内部char
缓冲区。 举个例子,
#include <string>
std::string INPUTFILE_DATABASE;
if (argc == 1)
INPUTFILE_DATABASE = "File_name.csv";
else
INPUTFILE_DATABASE = argv[1];
那就不应该那么复杂了:
char const* INPUTFILE_DATABASE = argc > 1 ? argv[1] : "File_name.csv";
您不应以任何一种方式修改此字符串,将其设置为char const *
可以防止产生错误。
首先:不要这样做,只需使用std::string
。 如果可以帮助您减少C样式字符串出现的愚蠢错误的数量,
回到您的问题:
auto i = std::make_unique<char[]>(512); // or more? (Could be calculated at runtime)
std::strcpy(i.get(), argv[1]);
if (i[0]=='\0')
{
cout << "No input file given" << endl;
std::strcpy(i.get(), "filename.csv");
}
cout << "Input file: " << i.get() << std::endl;
当然,直接与char *一起工作需要您知道字符数。 如前所述, std:: string
使事情变得更容易:
auto i = std::string(argc[1]);
if (i.empty())
{
cout << "No input file given" << endl;
i = "filename.csv";
}
cout << "Input file: " << i << std::endl;
对于这种特定情况, std::string_view
也应该起作用。
请注意,《 Lightness Races in Orbit
中的Lightness Races in Orbit
发布了另一种变体,它不需要您仅使用char const *
就可以为这种特定情况分配内存。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.