【问题标题】:How many bytes does a string take? A char?一个字符串占用多少字节?一个字符?
【发布时间】:2012-03-12 04:04:53
【问题描述】:

我正在复习我第一学期的 C++ 课,我想我漏掉了一些东西。一个字符串占用多少字节?一个字符?

我们给出的例子是,有些是字符文字,有些是字符串:

'n', "n", '\n', "\n", "\\n", ""

我对其中的换行符的使用感到特别困惑。

【问题讨论】:

  • “字符串”是指std::string 还是以空结尾的char*

标签: c++ string character


【解决方案1】:
#include <iostream>
 
int main()
{
        std::cout << sizeof 'n'   << std::endl;   // 1
        std::cout << sizeof "n"   << std::endl;   // 2
        std::cout << sizeof '\n'  << std::endl;   // 1
        std::cout << sizeof "\n"  << std::endl;   // 2
        std::cout << sizeof "\\n" << std::endl;   // 3
        std::cout << sizeof ""    << std::endl;   // 1
}

单引号表示字符,双引号表示带有不可见 NUL 终止符的 C 样式字符串。

\n(换行符)只是一个字符,\\(反斜杠)也是如此。 \\n 只是一个反斜杠,后跟 n。

【讨论】:

  • 如果您将 std::endl 更改为 '\n',我会为您 +1。
  • @Rob:由于'\n' 已经是任务的一部分,我不想不必要地混淆 Moshe。
  • 我没有考虑过使用std::endl 的正当理由。 +1
【解决方案2】:
  • 'n':不是字符串,是文字字符,一个字节,字母n的字符代码。
  • "n":字符串,两个字节,一个用于 n,一个用于每个字符串末尾的空字符。
  • "\n":两个字节作为 \n 代表“新行”,它占用一个字节,加上一个字节用于空字符。
  • '\n':和第一个一样,文字字符,不是字符串,一个字节。
  • "\\n":三个字节.. 一个用于 ,一个用于换行符和空字符
  • "":一个字节,就是空字符。

【讨论】:

  • 详细说明“字符串”(C 字符串?std::string?字符串文字?)为了清楚起见。
【解决方案3】:
  • char,顾名思义,占用一个字节。
  • 使用' 的文字是字符文字;使用 " 的文字是字符串文字。
  • 字符串文字是隐式以空值结尾的,因此它会比文字中可观察到的字符数多占用一个字节。
  • \ 是转义字符,\n 是换行符。

把这些放在一起,你应该就能弄明白了。

【讨论】:

    【解决方案4】:

    以下内容将占用内存中的 x 个连续字符:

    'n' - 1 char (type char)
    "n" - 2 chars (above plus zero character) (type const char[2])
    '\n' - 1 char
    "\n" - 2 chars
    "\\n" - 3 chars ('\', 'n', and zero)
    "" - 1 char
    

    编辑:固定格式

    edit2:我写了一些非常愚蠢的东西,感谢 Mooing Duck 指出这一点。

    【讨论】:

    • 其实sizeof("n")应该等于2。"n"的类型不是const char*,而是const char[2],即是两个字节。
    【解决方案5】:

    字符串占用的字节数等于字符串中的字符数加 1(终止符)乘以每个字符的字节数。每个字符的字节数可以变化。常规 char 类型为 1 个字节。

    您的所有示例都是一个字符长,除了倒数第二个是两个,最后一个是零。 (有些是char 类型,只定义一个字符。)

    【讨论】:

    • 每个char 的字节数为1。总是。请编辑答案。
    • char 定义为 1 个字节,但一个字节可能不是 8 位。
    • @Joe :C 标准明确规定:1 个字节必须至少 8 位,但可以更多。
    • @ildjarn Thanks
    【解决方案6】:

    'n' -> 一个charchar 始终为 1 个字节。这不是字符串。
    "n" -> 字符串文字,包含一个 n 和一个终止 NULL char。所以 2 个字节。
    '\n' -> 一个 char,一个 char 始终是 1 个字节。这不是字符串。
    "\n" -> 字符串文字,包含一个 \n 和一个终止 NULL char。所以 2 个字节。
    "\\n" -> 一个字符串文字,包含一个 \、一个 '\n' 和一个终止 NULL char。所以 3 个字节。
    "" -> 一个字符串文字,包含一个终止 NULL char。所以 1 个字节。

    【讨论】:

      【解决方案7】:

      您似乎指的是字符串常量。并将它们与字符常量区分开来。

      char 在所有架构上都是一个字节。字符常量使用单引号分隔符'

      字符串是一个连续的字符序列,带有一个尾随 NUL 字符,用于标识字符串的结尾。字符串使用双引号字符'"'。

      此外,您还介绍了 C 字符串常量表达式语法,该语法使用黑斜线表示特殊字符。 \n 是字符串常量中的一个字符。

      所以对于示例'n', "n", '\n', "\n":
      'n' 是一个字符
      "n" 是一个包含一个字符的字符串,但它需要存储两个字符(一个用于字母 n 和一个对于 NUL
      '\n' 是一个字符,换行符(基于 ASCII 的系统上的 ctrl-J)
      "\n" 是一个字符加一个 NUL。

      我让其他人根据这些来解谜。

      【讨论】:

        【解决方案8】:
        'n'   - 0x6e
        "n"   - 0x6e00
        '\n'  - 0x0a
        "\n"  - 0x0a00
        "\\n" - 0x5c6e00
        ""    - 0x00
        

        【讨论】:

          【解决方案9】:

          可能晚了 10 年。但是如果你只使用“Hello”,它只是一个字符数组,所以这将占用的字节数是这个字符数组的字符数(在这种情况下为 5)+ 1(一个 NULL 字符),这将是6 在这种情况下。 因此,您可以采用以下规则:对于 c_strings(char 数组):字符数 + 1

          还有你可以使用的 c++ 字符串 “包括 ” 之后 std::string = "你的文字在这里";

          这个 c++ 字符串总是有一个固定的大小(在我的机器上是 28 字节)。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-09-07
            • 1970-01-01
            • 1970-01-01
            • 2014-12-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-12-06
            相关资源
            最近更新 更多