【问题标题】:Strlen for strings in c++c++中字符串的strlen
【发布时间】:2015-09-09 19:43:27
【问题描述】:

我已将 c++ 转换为 c 类型字符串并使用 strlen,但它不工作。

 #include<bits/stdc++.h>
using namespace std;
int main(){
string s("Hello");
s.c_str();
cout<<strlen(s);
}

【问题讨论】:

  • 调用s.c_str() 不会将std::string 转换为“c 类型字符串”。它返回指向您忽略的std::string 中保存的字符串的指针。因此,该声明本质上是无操作的。试试:std::cout &lt;&lt; strlen(s.c_str ()) 或者,更好的是,std::cout &lt;&lt; s.size()
  • 这一行s.c_str(); 什么都不做。
  • 它.....不起作用?这是一个相当模糊的错误报告。它应该做什么?它实际上在做什么?
  • 恭喜!您刚刚包含了整个标准库并将其全部拉入全局命名空间。我看不出这与任何不平凡的事情都能很好地合作。解释一下:#include&lt;bits/stdc++.h&gt; 这包括整个该死的标准库或足够接近以至于没有区别。这是很多额外的编译。 using namespace std; 使 std 命名空间中的所有内容都是全局的。您正在用两行代码让自己陷入巨大的神秘错误噩梦。不要对自己这样做。
  • @user4581301 我们最近有一个meme :-D ...

标签: c++ string stl


【解决方案1】:
s.c_str();

这段代码实际上对s 没有关于转换等的副作用。您想进一步处理结果。

代替

cout<<strlen(s);

你想要一个

cout<<strlen(s.c_str());

cout<<s.size();

后者肯定更有效,因为标准要求 std::string::size() 的时间复杂度为 O(1),而 strlen() 不能保证比 O(strlen(s)) 更好的时间复杂度。

【讨论】:

  • 我要明确一点,调用 string::size() 是 O(1) 操作,而不是 strlen 的 O(n) 操作。
  • @Mgetz 公平点!也赞成他们的回答。无论如何,从长远来看,这个问题对我来说注定要失败。
  • 没有关于更有效的部分,至少 C++11 要求 string::size() 为 O(1)
  • @Mgetz 从概率变为肯定。
【解决方案2】:

如果您想在处理器中浪费时钟周期:

 cout << strlen(s.c_str());

将计算每个字符,直到s 中的第一个 nul 字符。

如果你只想知道字符串有多长:

 cout << s.length();

 cout << s.size();

将为您提供(并且使用 O(1) 的算法而不是 O(n)strlen 算法 - 这意味着一百万个字符长的字符串需要一百万倍的时间来测量长度。字符串)。 [当然,如果你有一个std::string,中间有一个nul字符,你可能会发现其中一种方法是“正确的”而另一种是“错误的”,因为它要么给出的长度太长要么太短- C 风格的字符串中间不允许包含 nul 字符,只允许作为终止符]

【讨论】:

    【解决方案3】:

    string 类处理业务时为什么要使用strlen

    请阅读http://en.cppreference.com/w/cpp/string/basic_string 而不是尺寸/长度方法

    否则按照@πάντα ῥεῖ 的建议进行

    【讨论】:

      猜你喜欢
      • 2020-03-23
      • 1970-01-01
      • 2020-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-01
      • 1970-01-01
      • 2020-07-14
      相关资源
      最近更新 更多