空字符和未初始化的内存如何影响 C++ 数组中的输出

问题描述 投票:0回答:1

char类型数组中的空字符影响输出。

我了解到,将字符串输入到char数组后,在输入的末尾添加了一个空字符。 cout函数遇到空字符时会自动停止打印。但是,我将索引 3 处的空字符(最初存在)替换为字符“d”,并将索引 4 设置为“e”。结果,我的程序的输出是dogde,后跟随机字符,直到数组大小结束。例如,它会打印dogde’’’’’’直到数组大小结束。我老师的结果显示,在索引 5 和 6 处添加两个随机字符后,空字符被放置在索引 7 处。

这是我的问题:

为什么空字符不会自动添加到字符“e”(索引 4)之后,以及为什么输出包含随机字符直到数组大小末尾? 如果我们不使用数组的完整大小,其他数组类型是否会自动分配空值?据我所知,其他数据类型的值都设置为 0,那么为什么 char 数组的值不同呢?

#include <iostream>
using namespace std;

int main()
{
    char array[10];
    cin >> array;
    cout << "Ket qua la " << array;
    int i = 0;
    while (array[i] != '\0' && i < 10)\
    {
        i++;
    }
    if (i < 9)
    {
        cout << endl << i;
    }
    cout << endl << "Sau do" << endl;
    array[i] = 'd';
    array[i + 1] = 'e';
    cout << array;
}
c++ arrays null
1个回答
0
投票

为什么空字符不会自动添加到字符“e”(索引 4)之后

没有人向C++委员会提出这个提案。如果有人这样做,我很确定它会很快被关闭,因为大多数人不希望在更改数组中的元素时更改其他元素。

为什么输出包含随机字符直到数组大小末尾?

array
开始时的值不确定,因为您尚未初始化它。

char array[10]{}; // Example of an array initialized with all `\0`

输入一个单词后,例如

Hi!
,在
std::cin >> array
中,
array
中只会初始化4个字节。
H
i
!
\0
和其余字节仍然不确定。它们可以是任何东西 - 这就是您在打印时看到的“垃圾”
array
。另请注意,在删除第一个后,不能保证
\0
中会有
array
,因此打印它可能会导致打印例程读取越界,这可能会导致程序崩溃(或更糟) .

如果我们不使用数组的完整大小,其他数组类型是否会自动分配空值?

基本类型的局部变量,如

char
int
,则不会。这包括此类类型的数组。它还包括此类类型的类,这些类在构造时不会初始化它们。

据我所知,其他数据类型的值都设置为 0,那么为什么 char 数组的值不同呢?

不,那是错误的。如果您不初始化它们,它们将处于不确定状态。

© www.soinside.com 2019 - 2024. All rights reserved.