我想从命令行获取文件名或为此设置默认名称。所以,以前我用

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/

10-11 22:10
查看更多