【问题标题】:Does std::string::c_str() always return a null-terminated string? [duplicate]std::string::c_str() 是否总是返回一个以空字符结尾的字符串? [复制]
【发布时间】:2012-10-02 20:29:55
【问题描述】:

可能重复:
string c_str() vs. data()

我使用 strncpy(dest, src_string, 32)std::string 转换为 char[32] 以使我的 C++ 类可以与旧版 C 代码一起使用。但是std::string的c_str()方法总是返回一个以null结尾的字符串吗?

【问题讨论】:

  • 是的,但如果您的 strncpy 太小,您可能不会复制它。假设您的空终止符位于索引 40 处,而您只复制 32 。不再为 null 终止。
  • c_str() 返回 C 字符串,由 C 标准定义为空终止。我称这不是一个真正的问题,因为我们在这里要做的就是解释“C 字符串”是什么意思,这并不适合这个网站。
  • @Griwes 我认为这不应该作为 NARQ 关闭,RTFM 将是关闭的更合适的理由:)

标签: c++ string


【解决方案1】:

std::string 的 c_str() 方法是否总是返回一个以 null 结尾的字符串?

是的。

它的规格是:

返回:一个指针p,使得p + i == &operator[](i) 对应[0,size()] 中的每个i

请注意,为i 指定的范围是封闭的,因此size() 一个有效索引,指的是字符串末尾之后的字符。

operator[] 是这样指定的:

返回:如果pos < size(),则返回*(begin() + pos),否则是对T类型对象的引用,其值为charT()

对于std::string,它是std::basic_string<char> 的别名,因此charTchar,值构造的char 的值为零;因此std::string::c_str() 的结果指向的字符数组是以零结尾的。

【讨论】:

  • 似乎值得一提的是,可能还有嵌入的 NUL。也就是说,很可能构造一个包含 NUL 字符的 std::string,只需执行 str.push_back(0);。这是使用 str::string 的一个优点,但应牢记一些。再说一次,std::string 包含嵌入的 NUL 是不寻常的,并且在 std::string 的许多用途中,这样的事情永远不会发生——它们不会神奇地出现。所以,请注意它。
【解决方案2】:

c_str 返回一个“C 字符串”。 C 字符串总是以空字符结尾。这是 C 标准。

Null terminating strings.

【讨论】:

    【解决方案3】:

    根据this,答案是肯定的。

    【讨论】:

    • 哇,我一直在用那个网站,为什么不好??
    • @nightcracker:粗俗的语言是不必要的,批评也是如此。是的,cplusplus.com 有(有?)错误和“meh”示例,但无论出于何种原因,这都变成了“哦,这是我讨厌超出合理批评的东西的机会”。让我们把它剪掉。我个人不时去那里通过搜索引擎快速参考。此外,并非每个答案都需要标准报价。
    • @Griwes:确实;就像出版史上的任何出版物一样,如果您仔细观察,可能会发现一些错误或措辞不佳的选择。该特定咆哮中的所有重要问题都已在很久以前修复。
    • @Griwes:是否适合使用它来使示例代码(甚至生产代码,只要您将其排除在标题之外)更易于阅读,这完全是主观的,就像大多数人一样的批评。该站点是对 C++ 工作原理的参考,而不是您或其他任何人喜欢的编写方式。
    • @Griwes:相反,SO 上的人们有更多的余地来关心更多良好的风格,因为我们会说“如果你要在没有约束...”,忽略对问题的任何更实际的约束。尽管如此,了解我们通常是工程师仍然很重要,他们最终需要解决问题。
    猜你喜欢
    • 2018-11-22
    • 2011-06-06
    • 1970-01-01
    • 2014-02-09
    • 1970-01-01
    • 2018-11-18
    • 1970-01-01
    • 2011-08-29
    • 1970-01-01
    相关资源
    最近更新 更多