不推荐将字符串转换为字符*

时间:2017-11-09 12:30:58

标签: c string char nvcc

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

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。那么,我该如何解决这个问题?

1 个答案:

答案 0 :(得分:5)

  

警告:不推荐将字符串文字转换为“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代替。