C++ 无法将字符串转换为常量字符

C++ 无法将字符串转换为常量字符,c++,string,char,strlen,C++,String,Char,Strlen,我有这个函数,编译器对我大叫“不能将字符串转换为常量字符” void 戏剧字母(字符串s,短时间长度) { 对于(int i=0,sLen=strlen(s);i代码> consch**/COD>和字符串是可互换的,但是只有当将代码> > const char */COD>转换为字符串 >时,才能采用一种方式。 您也没有理由想使用strlen。strlen很可能是用循环定义的,它永远不会像size()那样有效,这是字符串类的长度属性的唯一吸收器。只调用C++中没有C++替代的函数时,将字符串转换

我有这个函数,编译器对我大叫“不能将字符串转换为常量字符”

void
戏剧字母(字符串s,短时间长度)
{
对于(int i=0,sLen=strlen(s);istrlen()
用于C
const char*
字符串。要获取字符串的长度
s
,请使用
s.size()
s.length()
。如果要从
字符串中获取C字符串,请使用
s.C_str()

尽管C++使代码看起来>代码> consch**/COD>和字符串是可互换的,但是只有当将代码> > const char */COD>转换为<代码>字符串 >时,才能采用一种方式。
您也没有理由想使用
strlen
strlen
很可能是用循环定义的,它永远不会像
size()那样有效,这是字符串类的长度属性的唯一吸收器。只调用C++中没有C++替代的函数时,将<代码>字符串转换成C字符串。< /P> < P>不应该混合C和C++字符串函数,而不是<代码> STRUNN()/CUT>(C样式函数),使用:

for(int i=0,sLen=s.size();icout正如chris在评论中所说,strlen用于
常量char*
,而您传递的是
字符串,而不是

for(int i = 0, sLen = strlen(s); i < sLen; i++){
    cout << s[i];
    Sleep(TimeLength);
}
for(int i=0,sLen=strlen;icout
strlen
char const*
上运行。如果您真的想,您可以执行
strlen(s.c_str())
,但是
std::string
有很多功能,包括一个
length()
方法,该方法返回字符串中的字符数

请注意:

  • 您不需要修改函数中的字符串,因此最好将常量引用传递给它(conststring&s)

  • 字符串本身定义了获取其长度的方法-s.size()和s.length()都可以工作。另外的好处是,这两种方法在复杂性方面是恒定的,而不是strlen的线性复杂性

  • 如果您真的想使用strlen,请使用s.c_str():
    strlen(s.c_str())


只需使用
s.length()
s.size()
。字符串不会隐式转换为字符数组。如果确实需要字符数组(长度不需要),请使用
s.c_str()
。只是一个一般性的提示-如果标准函数出现问题,99.99%的时间都是你的错。你不使用成员函数让我想引导你解决这个问题。仔细看看,看看有什么可用的。@Cubic:没错。我有过这样的经历:某些东西一定是标准库错误,但那是一个错误在我的代码中,任何你认为是bug的东西都是最可能实现的行为。只是读取了文档。所以不是所有的C函数都可以用在C++中。@ USE1515615c++“重新实现”C++的许多特性(例如,使用类<代码> STD::String < /Cord>),而不是仅仅是一个字符数组和“代码> StrLin < /C> >,<代码> StrcPy < /Cuff>等)。实际上,你仍然可以使用C风格的特征。实际上你可以制作一个看起来像C的C++程序,但是你不应该把C和C++的解决方案混合起来,比如<代码> STD::String < /Cuff>(从C++)到<代码>斯特伦< /代码>,<代码> STRCMP < /C> >(从C)。
for(int i = 0, sLen = s.size(); i < sLen; i++) {
    cout << s[i];
    Sleep(TimeLength);
}
for(int i = 0, sLen = strlen(s); i < sLen; i++){
    cout << s[i];
    Sleep(TimeLength);
}
for(int i = 0, sLen = s.length(); i < sLen; i++){
    cout << s[i];
    Sleep(TimeLength);
}