【问题标题】:How to get length of a string using strlen function如何使用strlen函数获取字符串的长度
【发布时间】:2013-12-09 11:01:05
【问题描述】:

我有以下代码可以获取并打印一个字符串。

#include<iostream>
#include<conio.h>
#include<string>
using namespace std;

int main()
{
    string str;
    cout << "Enter a string: ";
    getline(cin, str);
    cout << str;
    getch();
    return 0;
}

但是如何使用strlen()函数统计这个字符串中的字符数呢?

【问题讨论】:

  • str.size() 怎么样?
  • main 必须返回 int
  • 为什么是strlen
  • 所以我们不能使用 strlen() 函数计算字符串中的字符数?
  • 标题?作者?它显然是由不太了解该语言的人编写的,并且可能包含更严重的错误。我想警告人们远离它。

标签: c++ string


【解决方案1】:

对于 C++ 字符串,没有理由使用 strlen。只需使用string::length:

std::cout << str.length() << std::endl;

您应该强烈更喜欢这个而不是strlen(str.c_str()),原因如下:

  1. Claritylength()(或size())成员函数明确地返回字符串的长度。虽然可以弄清楚strlen(str.c_str()) 做了什么,但它迫使读者暂停一下。

  2. 效率length()size() 运行时间为 O(1),而 strlen(str.c_str()) 需要 Θ(n) 时间才能找到字符串的结尾。

  3. 风格:最好选择 C++ 版本的函数而不是 C 版本,除非有特定的理由这样做。这就是为什么通常认为使用std::sort 比使用qsortstd::lower_bound 比使用bsearch 更好的原因,除非某些其他因素会影响性能。

我能想到strlen 在哪里有用的唯一原因是,如果您有一个嵌入空字符的 C++ 样式字符串,并且您想确定在第一个字符之前出现了多少个字符。 (这是strlenstring::length 不同的一种方式;前者在空终止符处停止,后者计算字符串中的所有字符)。但如果是这样的话,就用string::find

size_t index = str.find(0);
if (index == str::npos) index = str.length();
std::cout << index << std::endl;

希望这会有所帮助!

【讨论】:

  • 你的代码是正确的,但是我读到c的所有函数都是用C++导入的,我们可以在C中使用strlen,如何在C++中使用
  • @AkashSharma- 你可以通过编写strlen(str.c_str()) 在 C++ 字符串上使用strlen,但这将是非常糟糕的风格。尽管 C++ 吸收了 C 的标准库,但 C++ 标准库通常包含这些函数的更多 C++ 友好版本,当您可以使用 string::length 时,没有理由使用 strlen
  • 如果我想使用strlen()那为什么我不能使用strlen(str);
  • @AkashSharma-strlen 接受const char*,而std::string 不是const char*。也就是说 - 在这里使用strlen 真的不是一个好主意!
  • @AkashSharma- 我相信这是历史性的。 STL 包含使用size(),我认为历史上string 使用length()。这可能是为了向后兼容。
【解决方案2】:

函数strlen 显示\0 之前的字符数,将其用于std::string 可能会报告长度错误。

strlen(str.c_str()); // It may return wrong length.

在 C++ 中,字符串可以在字符中包含\0,但 C 风格的零终止字符串不能包含在末尾。如果std::string 在最后一个字符之前有\0,则strlen 报告长度小于实际长度。

尝试使用.length().size(),我更喜欢第二个,因为另一个标准容器有它。

str.size()

【讨论】:

  • .size 也是正确的。我实际上使用它而不是length
  • 为什么 C++ 中给出了两个函数 size() 和 length() ?有什么具体原因吗?因为两者都在做同样的工作。
  • @AkashSharma 你可以在这里查看:size and length
【解决方案3】:

使用std::string::sizestd::string::length(两者相同)。

当你坚持使用strlen时,你可以:

int size = strlen( str.c_str() );

注意std::string::c_str 的用法,它返回const char*

但是 strlen 计数,直到它击中 \0 字符和 std::string 可以存储这样的字符。换句话说,strlen 有时可能会因为大小而撒谎。

【讨论】:

  • c_str()documentation from cppreference:返回一个指向以空字符结尾的字符数组的指针,其数据与存储在字符串中的数据相同。
  • @Johan:不一定。 std::string 可以包含嵌入的空字符。如果你有一个std::stringfoo 的值为"foo\0bar",则.length() 为7,但strlen(foo.c_str()) 将返回3。
  • 我的错误,我以另一种方式阅读了您的消息(最后没有'\0')。
  • 对不起,我删除了我之前变得毫无意义的评论。
【解决方案4】:

如果你真的非常想使用 strlen(),那么

cout << strlen(str.c_str()) << endl;

否则 .length() 的使用更符合 C++。

【讨论】:

    【解决方案5】:

    手动:

    int strlen(string s)
    {
        int len = 0;
    
        while (s[len])
            len++;
    
        return len;
    }
    

    【讨论】:

    • 你是认真的还是讽刺的? :)
    【解决方案6】:
    #include<iostream>
    #include<conio.h>
    #include<string.h>
    using namespace std;
    int main()
    
    {
        char str[80];
    
        int i;
    
        cout<<"\n enter string:";
    
        cin.getline(str,80);
    
        int n=strlen(str);
    
        cout<<"\n lenght is:"<<n;
    
        getch();
    
        return 0;
    
    }
    

    如果你想使用 strlen ,这就是程序。 希望这会有所帮助!

    【讨论】:

      【解决方案7】:

      简单地使用

      int len=str.length();

      【讨论】:

        猜你喜欢
        • 2019-03-11
        • 2016-01-01
        • 2015-03-16
        • 2020-12-19
        • 1970-01-01
        • 1970-01-01
        • 2013-02-01
        • 1970-01-01
        • 2011-05-08
        相关资源
        最近更新 更多