【问题标题】:Issue with char array of size one and strcat大小为 1 的 char 数组和 strcat 的问题
【发布时间】:2010-01-07 17:53:22
【问题描述】:

好吧,我真的对 VS2008 中的这种行为感到困惑。

这段代码..

char data[512] = "";

char c[1] = "";
c[0] = '1';

strcat(data, c);

.. 导致 data 被设置为此字符串值:1ÌÌÌÌhÿ

当然应该只是1

如何确保 data 仅包含我复制到其中的单个 char[](即 1)?

为什么strcat() 复制所有这些垃圾?为什么c 甚至包含那些垃圾?

感谢您的帮助

编辑:谢谢大家。

【问题讨论】:

    标签: c++ arrays char


    【解决方案1】:

    这里的问题是您将无效值传递给 strcat。它期望第二个参数是一个有效的 c 字符串值。为了有效,它必须是以空终止符 (\0) 结尾的 char 值的数组/指针。您传递的值不包含空终止符,因此无效。

    您需要为字符串值c 定义一个空终止符才能有效。例如

    char c[2];
    c[0] = '1';
    c[1] = '\0';
    

    【讨论】:

      【解决方案2】:

      因为 strcat() 复制 C-String。 C 字符串以 '\0' 结尾。因此,当您复制“c”时,它会从那里开始搜索内存,直到找到包含“\0”的内存位置,然后将所有这些复制到数据中。

      你需要做的是确保 'c' 是一个真正的 C 字符串('\0' 终止)

      char c[2] = {};  // Sets all members to '\0';
      c[0]      = '1'; // Sets c[0] to '1' but leaves c[1] as '\0'
      
      // c Is still a C-string as it is a sequence terminated with a '\0' character.
      

      【讨论】:

        【解决方案3】:

        不,它不应该是“只有 1”。您的 c 数组不是 C 字符串,因为您未能对其进行零终止。当您将不是 C 字符串的内容传递给 strcat 时,行为未定义。这是你在你的案例中观察到的。

        请注意,根本不可能将字符串 "1" 压缩到大小为 1 的数组中。您需要至少包含 2 个字符的数组:一个用于 '1' 字符,一个用于零终止符。

        您可以简单地将c 的声明更改为

        char c[2] = ""; 
        

        并且代码将按预期工作(我理解您的意图的方式)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-10-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-11-24
          • 2018-04-14
          相关资源
          最近更新 更多