我想从命令行获取文件名或为此设置默认名称。所以,以前我用
static char *fName;
if (argc == 2 ) {
fName = argv[1];
}
else {
fName = "default_file.txt";
}
但是对于
else
,我得到了warning: conversion from a string literal to "char *" is deprecated
。如果我尝试这样的事情:static char fName [30] = "default_file.txt";
if (argc == 2 ) {
fName = argv[1]; //error
}
现在,我得到
error: expression must be a modifiable lvalue
。那么,我该如何解决呢? 最佳答案
警告:不建议将字符串文字转换为“char *”
这几乎肯定意味着您正在使用C++编译器。字符串文字(例如您的示例中的"default_file.txt"
)曾经在C和C++中都是char[]
类型。写入字符串文字会调用未定义的行为。因此,C++将字符串文字的类型更改为const char[]
。但是在C语言中,类型仍然是char[]
。因此,该警告表明您正在使用C++编译器来编译C代码,这通常不明智。
请注意,在C和C++中,使用非const
限定的指向字符串文字的指针是不好的做法。
现在,我得到一个错误:表达式必须是可修改的左值。
因为您无法在运行时使用赋值运算符将值分配给数组。 C语法不允许这样做。您将不得不使用memcpy,strcpy或类似的东西。
更正后的代码应如下所示:
static const char* fName = "default_file.txt";
if (argc == 2 ) {
fName = argv[1];
}
这对C和C++都很好,尽管在C++中,建议您改用
std::string
。关于c - 从字符串到char的过时转换*,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47201916/