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()
用于Cconst 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();i cout正如chris在评论中所说,strlen用于常量char*
,而您传递的是字符串,而不是
for(int i = 0, sLen = strlen(s); i < sLen; i++){
cout << s[i];
Sleep(TimeLength);
}
for(int i=0,sLen=strlen;i coutstrlen
在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);
}