【问题标题】:C++11 char16_t strlen-equivalent functionC++11 char16_t strlen 等效函数
【发布时间】:2011-08-14 16:19:59
【问题描述】:

我有一个简单的问题: 有没有办法在以零结尾的char16_t 数组中进行类似strlen() 的字符计数?

【问题讨论】:

    标签: c++11 strlen char16-t


    【解决方案1】:

    使用指针:),创建一个指向起点的重复指针,然后循环遍历它while (*endptr++);,然后长度由endptr - startptr 给出。您实际上可以对此进行模板化,但是,编译可能不会生成与 strlen 相同的内部代码(对于不同大小的 c)。

    【讨论】:

    • 哎呀,看起来很难看,虽然它很短......顺便说一句,我不是在侮辱你的代码,只是奇怪的是 strlen 或 wstrlen 没有过载......
    • @NoSense:如果您曾经查看过 MS 或 GCC 的 CRT 源代码,您会发现他们使用这种方法来处理 strlen 等人。 Ofc 它不如 SSE 4.1 字符串指令或旧的 REP SCAS 之类的汇编级别的东西快,但这就是内在的;)有关于基于 sse 的版本的文章(gcc 甚至有一些它使用的变体),但是这会限制您的硬件
    • @NoSense:最后我看到 gcc 更喜欢硬编码符号名称的重载以使代码生成器输出“特殊”程序集,它实际上没有和程序集函数(这不包括库,以及afaik glibc 也没有程序集)
    • 大家好,char_traits<> 从那时起就一直存在。使用它们!
    • @Johannes:好像问题没有问到字形的计数。
    【解决方案2】:

    使用

    char_traits<char16_t>::length(your_pointer)
    

    参见 C++11-Std 的 21.2.3.2 struct char_traits&lt;char16_t&gt;table 62

    【讨论】:

      【解决方案3】:

      Necrolis answer 在长度中包含 NULL 字节,这可能不是您想要的。 strlen() 在长度中包含 NULL 字节。

      调整他们的答案:

      static size_t char16len(uint16_t *startptr)
      {
              uint16_t *endptr = startptr;
              while (*endptr) {
                      endptr++;
              }
              return endptr - startptr;
      }
      

      我意识到有一个公认的 C++ 答案,但这个答案对于使用 C 偶然发现这篇文章的任何人都很有用(就像我一样)。

      【讨论】:

        猜你喜欢
        • 2013-05-18
        • 2022-07-19
        • 2013-01-09
        • 2013-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-24
        • 2021-08-20
        相关资源
        最近更新 更多