C++ strrchr导致';无法从常量字符*转换为字符*';

C++ strrchr导致';无法从常量字符*转换为字符*';,c++,string,visual-studio-2010,C++,String,Visual Studio 2010,我正在尝试编译一些给我的代码,他们告诉我编译得很好。也许在另一个编译器上。我正在使用VS2010,我有以下行: char *dot = strrchr(filename, '.'); 这会导致编译器错误: 错误C2440:“正在初始化”:无法从“常量字符*”转换为 “char*” 为什么?我如何修复它?错误消息非常清楚。strrchr返回一个const char*。因此您需要: const char *dot = strrchr(filename, '.'); 如果您真的需要一个char*,

我正在尝试编译一些给我的代码,他们告诉我编译得很好。也许在另一个编译器上。我正在使用VS2010,我有以下行:

char *dot = strrchr(filename, '.');
这会导致编译器错误:

错误C2440:“正在初始化”:无法从“常量字符*”转换为 “char*”


为什么?我如何修复它?

错误消息非常清楚。
strrchr
返回一个
const char*
。因此您需要:

const char *dot = strrchr(filename, '.');

如果您真的需要一个
char*
,您可以使用
strcpy
进行转换。

C++由于重载而比C有更健全的
strchr
strrchr
版本,所以说:

const char * dot = strrchr(filename, '.');

在没有重载的C中,只有一个函数
char*strrchar(constchar*,constchar*)< /代码>,取决于你要输入的函数是哪一种类型的指针。C有很多这样的类型不安全的函数。< /P>我修改了标签,因为我没有看到C++的任何引用。<代码>文件名< /代码>是什么类型?@李察:不要这样做。正如Kerrek指出的那样。答案,在C++标准库中出现的重载将对行为产生重大影响。或者将结果转换为<代码> char */COD>这样:<代码>(char *)Strurr(文件名)“,”);
@AtoMerZ:最好显式使用
常量强制转换
@AtoMerZ丢弃常量从来都不是一个好主意。它可能会导致未定义的行为。在我遇到的某些情况下,我需要能够修改结果,这就是为什么我更喜欢将结果转换为非常量类型。@AtoMerZ我重复我自己-这可能导致o未定义的行为。如果需要
char*
而不是
const char*
,请使用
strcpy