【问题标题】:Why do I get garbage value when output character array to console?为什么将字符数组输出到控制台时会得到垃圾值?
【发布时间】:2013-11-28 14:35:45
【问题描述】:

当我输出我的数组时,我总是在最后得到一个像这样的垃圾值 'Íýýýý««««««««îþîþ'。我做错了什么?

void func()
{
    const int size = 100;
    char * buffer = new char[size];
    for(int i=0; i<size; i++)
        buffer[i] = ' ';

    cout<<buffer;
}

但是,如果我使用 for 循环来输出缓冲区,则没有垃圾值。

【问题讨论】:

  • std::cout &lt;&lt; std::string(100, ' '); 有什么问题?屏幕上有 100 个空格,没有索引,没有循环,没有内存泄漏,...

标签: c++


【解决方案1】:

因为您没有终止缓冲区,std::cout.operator&lt;&lt;(char*) 将尝试查找 \0 作为其终止字符。

正如 cmets 中所指出的,请随意将 \0 附加到缓冲区的末尾:)。

【讨论】:

  • 但是请把分隔符放在缓冲区的末尾,而不是末尾 --> buffer[size-1] = '\0';
  • @P0W: i 在该范围内不可用
【解决方案2】:

ScarletAmaranth 是对的。 C 风格的字符串(一个 char 数组)必须以 char '\0' 结尾。这就是使用 char 数组(在本例中为 cout)的函数知道字符串何时在内存中完成的方式。如果您忘记了数组末尾的 '\0' 字符,cout 将打印数组中的所有字符,然后在数组之后继续打印内存中的任何数据。这些其他数据是垃圾,这就是为什么你会看到这些奇怪的字符。

如果使用字符串类型(更多 C++ 风格)而不是 char 数组,则不会出现此问题,因为字符串类型不使用 '\0' 作为字符串分隔符。

另一方面,当您使用循环遍历数组的 100 个元素时,您不会看到垃圾,因为您只打印这 100 个字符。我的意思是,您可以准确控制要打印的内容并知道何时停止,而不是让 cout 函数确定何时停止打印。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-09
    • 1970-01-01
    • 2020-12-17
    • 2021-11-02
    • 2015-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多