C++ 为什么在将字符数组输出到控制台时获取垃圾值?

C++ 为什么在将字符数组输出到控制台时获取垃圾值?,c++,C++,当我输出数组时,我总是在最后得到这样的垃圾值“Íýý««««««««««««îþîþ”。我做错了什么 void func() { const int size = 100; char * buffer = new char[size]; for(int i=0; i<size; i++) buffer[i] = ' '; cout<<buffer; } 但是,如果我使用for循环来输出缓冲区,则没有垃圾值。因为您不使用null

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

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

    cout<<buffer;
}

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

因为您不使用null终止缓冲区,所以std::cout.operator因为您不使用null终止缓冲区,所以std::cout.operatorScarletAmaranth是正确的。C样式字符串字符数组必须以字符“\0”结尾。这就是使用字符数组的函数在本例中无法知道字符串在内存中何时结束的方式。如果忘记了数组末尾的“\0”字符,则cout将打印数组中的所有字符,然后继续打印数组后内存中的任何数据。这些其他数据都是垃圾,这就是为什么你会看到这些奇怪的字符

如果使用字符串类型更多的C++样式而不是字符数组,则不会有此问题,因为字符串类型不使用“0”作为字符串分隔符。


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

ScarletAmaranth是正确的。C样式字符串字符数组必须以字符“\0”结尾。这就是使用字符数组的函数在本例中无法知道字符串在内存中何时结束的方式。如果忘记了数组末尾的“\0”字符,则cout将打印数组中的所有字符,然后继续打印数组后内存中的任何数据。这些其他数据都是垃圾,这就是为什么你会看到这些奇怪的字符

如果使用字符串类型更多的C++样式而不是字符数组,则不会有此问题,因为字符串类型不使用“0”作为字符串分隔符。


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

但是请将分隔符放在缓冲区的末尾,而不是超过结尾->缓冲区[size-1]='\0'@P0W:i在该范围内不可用,但请将分隔符放在缓冲区的末尾,而不是超过末尾->缓冲区[size-1]='\0'@P0W:i在该范围内不可用std::cout有什么问题std::cout有什么问题