【问题标题】:Cannot convert string to const char无法将字符串转换为 const char
【发布时间】:2012-08-15 14:08:30
【问题描述】:

我有这个函数,编译器对我大喊“无法将字符串转换为 const char”。

void 
DramaticLetters(string s, short TimeLength)
{
    for(int i = 0, sLen = strlen(s); i < sLen; i++){
        cout << s[i];
        Sleep(TimeLength);
    }
}

我认为 strlen 有问题

【问题讨论】:

  • 只需使用s.length()s.size()。字符串不会隐式转换为字符数组。如果你真的需要一个(你不需要太长),请使用s.c_str()
  • 只是一个一般性提示 - 如果标准函数出现问题,99.99% 的时间都是你的错。
  • 你不使用成员函数让我想引导你到这个reference page。浏览并了解可用的内容。
  • @Cubic:没错。我有过一些经验,had 是标准库错误,但那是我的代码中的错误。任何你认为是错误的东西很可能是实现定义的行为。只需阅读文档。

标签: c++ string char strlen


【解决方案1】:

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 字符串。

【讨论】:

    【解决方案2】:

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

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

    这里有一个reference,其中包含string 类中的所有方法。

    【讨论】:

    • 所以不是所有的C函数都可以在C++中使用?
    • @user1575615 C++“重新实现”了许多 C 特性(例如,使用类 std::string 而不仅仅是一个字符数组和 strlenstrcpy 等)。不过,您仍然可以使用 C 风格的功能。实际上你可以制作一个看起来像 C 的 C++ 程序,但你不应该混合 C 和 C++ 解决方案,例如 std::string(来自 C++)与 strlenstrcmp 等(来自 C)。
    【解决方案3】:

    正如克里斯在他的评论中所说,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);
    }
    

    【讨论】:

      【解决方案4】:

      strlenchar const * 上运行。如果你真的想,你可以做strlen(s.c_str()),但是std::string有很多功能,包括一个length()方法,它返回字符串中的字符数

      【讨论】:

        【解决方案5】:

        几点说明:

        • 您不要在函数中修改字符串,因此最好将 const 引用传递给它(const string& s)

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

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

        【讨论】:

          猜你喜欢
          • 2014-05-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-21
          相关资源
          最近更新 更多