无法将字符串转换为const char

3
我有这个函数,编译器告诉我说“无法将字符串转换为const char”。
void 
DramaticLetters(string s, short TimeLength)
{
    for(int i = 0, sLen = strlen(s); i < sLen; i++){
        cout << s[i];
        Sleep(TimeLength);
    }
}

我觉得strlen出了问题


5
只需使用s.length()s.size()。字符串不会隐式转换为字符数组。如果你真的需要一个(在这里并不需要),可以使用s.c_str() - chris
https://dev59.com/r3RC5IYBdhLWcg3wSu97?rq=1 - Matt K
1
只是一个一般性的提示 - 如果标准函数出了问题,99.99%的情况下是你的错。 - Cubic
1
你没有使用成员函数让我想引导你到这个参考页面。仔细查看并了解可用的内容。 - chris
@Cubic:没错。我曾经遇到过一些必须是标准库错误的情况,但那其实是我的代码出了问题。你认为是 bug 的任何东西都很可能是实现定义行为。只需要仔细阅读文档即可。 - Linuxios
5个回答

4

strlen()是用于C语言中的const char*字符串。要获取字符串s的长度,请使用s.size()s.length()。如果你想从一个string获取一个C字符串,使用s.c_str()

虽然C++使得const char*string看起来是可以互换的,但只有将const char*转换为string时才能这样做。

没有理由使用strlenstrlen很可能使用循环定义,而这永远不可能像size()那样高效,后者很可能只是string类的长度属性的getter。只有在调用没有C++替代方法的C函数时,才将string转换为C字符串。


1

您不应该混合使用 C 和 C++ 字符串函数。而是使用 string::size() 代替 strlen()(一种 C 风格的函数):

for(int i = 0, sLen = s.size(); i < sLen; i++) {
    cout << s[i];
    Sleep(TimeLength);
}

这里有一个参考链接,其中包含了string类的所有方法。


并非所有的C函数都可以在C++中使用? - skittles sour
@user1575615 C++“重新实现”了许多C功能(例如,使用类std::string代替仅使用char数组和strlenstrcpy等)。不过你仍然可以使用C风格的功能。实际上,你可以创建一个看起来像C的C++程序,但你不应该混合C和C++解决方案,如从C++中的std::string和从C中的strlenstrcmp等。 - betabandido

1
正如克里斯在评论中所说,strlen用于“const char *”,而您正在传递一个“string”。不要使用
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);
}

0

strlen 作用于 char const *。如果你真的想要,你可以使用 strlen(s.c_str()),但是 std::string 有很多功能,包括一个 length() 方法,它返回字符串中字符的数量。


0
一些注释:
  • 在函数内部不修改字符串,因此最好传递一个const引用(const string& s)

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接