【问题标题】:C-strings null terminating character \0 modificationC-strings null 终止字符 \0 修改
【发布时间】:2013-10-05 23:41:44
【问题描述】:

C 字符串末尾的空字符是否始终不变且不能修改?意思是,程序员可以修改 C 字符串末尾的空字符 /0 吗?或者它是恒定的并且不能被移除。示例:'Steak' 在 cstring 中,它在第 5 位有 \0。当 'steak' 被修改时,我们可以完全删除 \0 吗?

【问题讨论】:

  • 只是存储中的一个字符。它可以像任何其他角色一样被修改(后果自负)。但重要的是让它在那里标记标准 C 字符串的结尾,否则字符串的长度必须单独传递给字符串函数。
  • 问题本身无效。 C 字符串是一个以零结尾的字符串。如果删除 0,则它不再是 C 字符串,并且您不再可以将其与标准字符串函数一起使用。如果您有使用 Pascal 的经验:类比是“可以从 Pascal 字符串中删除长度吗?” -- 与这里给出的答案几乎相同。

标签: c++ string c-strings


【解决方案1】:

C 字符串末尾的空字符是否始终不变且不能修改?

,如果我们谈论的是字符数组(静态或动态),但 ,如果您指的是常量字符串文字,例如:

const char* str = "steak";

程序员可以修改 C 字符串末尾的空字符 /0 吗?

可以,只要内存不是只读的。

我们可以完全删除 \0 吗?

是的。但是,如果您将此字符串与期望 '\0' 的函数一起使用,行为未定义

【讨论】:

  • 可能值得注意的是,因为文字 C 字符串是常量,它们不能被修改。但是,当一个字符串是动态分配时,你肯定是正确的。
  • 换句话说,仅仅因为你可以并不意味着你应该
【解决方案2】:

如果 C 字符串是 std::stringc_str()data() 成员函数的返回值,则标准禁止修改尾随 0 元素。当然,仅仅因为标准禁止它并不意味着 C++ 或其运行时环境中的任何内容都会警告您违规。您很有可能编写代码来尝试修改尾随的0,并且它会在不引发任何警报的情况下执行。然而,事情也很可能会以无法预料的奇怪方式出错。

所以不要这样做。

【讨论】:

    猜你喜欢
    • 2014-12-03
    • 2014-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-04
    • 1970-01-01
    相关资源
    最近更新 更多