【问题标题】:Char pointer giving me some really strange charactersChar 指针给了我一些非常奇怪的字符
【发布时间】:2013-10-05 11:53:24
【问题描述】:

当我运行示例代码时,wordLength 为 7(因此输出为 7)。但是我的 char 数组最后会得到一些非常奇怪的字符。

wordLength = word.length();

cout << wordLength;

char * wordchar = new char[wordLength]; //new char[7]; ??

for (int i = 0; i < word.length(); i++) //0-6 = 7
{
    wordchar[i] = 'a';
}

cout << wordchar;

输出:7 aaaaaaa²²²²¦¦¦¦ÂD╩2¦♀

期望的输出是:aaaaaa...它背后的垃圾是什么??又是怎么到那里去的?

【问题讨论】:

    标签: c++


    【解决方案1】:

    您应该在wordchar 的末尾添加\0

    char * wordchar = new char[wordLength +1];
    //add chars as you have done
    wordchar[wordLength] = `\0`
    

    原因是 C 字符串是空终止的。

    【讨论】:

    • 是不是因为它是动态字符我需要自己做?
    • 不,正如其他帖子所指出的,这是因为C-string是空终止的,这意味着您需要在末尾添加\0才能达到此目的。
    【解决方案2】:

    C 字符串以 '\0' 字符结尾,表示它们的结束(相比之下,C++ std::string 只是单独存储长度)。

    在将字符复制到wordchar 时,您并没有终止字符串,因此,当operator&lt;&lt; 输出wordchar 时,它会继续直到找到恰好位于内存位置之后的第一个\0 字符由wordchar 指向,并在此过程中打印所有碰巧在内存中的垃圾值。

    要解决此问题,您应该:

    1. 将分配的字符串加长1个字符;
    2. 在末尾添加\0 字符。

    不过,在 C++ 中,您通常只想使用 std::string

    【讨论】:

      【解决方案3】:

      用途:-

      char * wordchar = new char[wordLength+1]; // 1 extra for null character

      for 循环之前和

      wordchar[i] ='\0'

      在 for 循环之后,C 字符串以 null 结尾。

      没有这个它会继续打印,直到找到第一个空字符,打印所有垃圾值。

      【讨论】:

        【解决方案4】:

        你避免了尾随的零,这就是原因。

        在 C 和 C++ 中,整个生态系统处理字符串长度的方式是它假定尾随零('\0' 或简单的 0 数字)。这与例如 pascal 字符串不同,其中内存表示以数字开头,该数字告诉有多少下一个字符构成特定字符串。

        因此,如果您要存储某个字符串内容,则必须为尾随零分配一个额外的字节。如果您操纵内存内容,则必须始终牢记尾随零并保留它。否则strstr 和其他字符串操作函数可能会在偏离轨道时改变内存内容并继续处理以下内存部分。没有尾随零 strlen 也会给出错误结果,它也会计数,直到遇到第一个零。

        您不是唯一犯此错误的人,它通常在安全漏洞及其利用中扮演重要角色。该漏洞利用了函数偏离轨道并操纵其他东西的副作用,而不是最初的意图。这是C语言中非常重要和危险的部分。

        在 C++ 中(如您标记您的问题),您最好使用 STL 的 std::string 和 STL 方法而不是 C 样式操作。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-01-12
          • 2011-03-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-01-11
          相关资源
          最近更新 更多