C++ 使用char将一个char数组分配给另一个char数组时的奇怪行为

C++ 使用char将一个char数组分配给另一个char数组时的奇怪行为,c++,arrays,C++,Arrays,当我尝试将一个元素从char数组复制到一个char数组,然后从同一个char数组复制到另一个char数组时,第二个char数组会给出奇怪的输出,通常包含第一个char数组中的整个字符串。仅当第二个字符数组未初始化时才会发生这种情况。我的问题是char如何将整个字符串传输到另一个char数组 int main() { char a[10] = "ababababa"; char b[5]; char temp; temp=a[1]; b[0]=temp;

当我尝试将一个元素从char数组复制到一个char数组,然后从同一个char数组复制到另一个char数组时,第二个char数组会给出奇怪的输出,通常包含第一个char数组中的整个字符串。仅当第二个字符数组未初始化时才会发生这种情况。我的问题是char如何将整个字符串传输到另一个char数组

int main()
{
    char a[10] = "ababababa";
    char b[5];
    char temp;

    temp=a[1];
    b[0]=temp;

    std::cout<<b;

}
intmain()
{
字符a[10]=“abababa”;
charb[5];
焦炭温度;
温度=a[1];
b[0]=温度;
标准::cout
这里,
b
是一个由未初始化的
5
字符组成的数组。在初始化它们之前检查它们的值会导致未定义的行为

在这里,您只对
b
的第一个元素初始化assign,其余元素仍未初始化

std::cout<<b;

std::cout未初始化
b
中的字符,因此不太可能包含空字符。请将第一个字符初始化为
'b'
,然后打印数组

调用
char*
stream运算符,该运算符通过扫描字符串直到找到空字符来确定字符串的长度。由于数组不包含空字符,它会一直读取数组的末尾,直到它在其他地方碰巧找到空字符。在您的情况下,编译器似乎有存储空间d
a
在堆栈中的
b
之后,它打印
b
的所有元素,一些其他字符(可能
b
在内存中填充到偶数个字节)然后
a
的内容停止在
a
末尾的空终止符处。所有这些都不能保证,并且会在编译器、操作系统甚至程序的不同运行之间更改。欢迎来到未定义行为的世界

简单的解决方法是在程序开始时将
b
初始化为全零:

#include <algorithm>
#include <iostream>

int main()
{
    char a[10] = "ababababa";
    char b[5];
    std::fill(std::begin(b), std::end(b), '\0');
    char temp;

    temp=a[1];
    b[0]=temp;

    std::cout<<b;

}

如果要使用C样式的字符串,请确保nul正确终止它们,否则会出现奇怪的情况。请尝试用零初始化
b
char b[5]={0};
,您当前的代码有未定义的行为,因为
b
需要一个终止NUL字符。是否有可能在输出数组
b
时,它也以某种方式输出数组
a
。因为我在初始化数组
b
后尝试了这个方法,所以它给出了正确的结果output@PK2n不明确的行为几乎使人失望可能的事。@πάνταῥεῖ 谢谢,它解释了这种情况。那不是初始化。@LightnessRacesinOrbit我想你是指我说的“在这里,你只初始化
b
”的第一个元素-正确,这是赋值,不是初始化。没错。“初始化它们”!=“给它们值”(尽管这是一种方式)赋值和初始化是不一样的。但是,
T={}
T{}
大多数时候都被视为相同的,它们并不完全相同。在我遇到字符数组问题后,我开始在我的项目中使用
std::string
std::cout<<b;
#include <algorithm>
#include <iostream>

int main()
{
    char a[10] = "ababababa";
    char b[5];
    std::fill(std::begin(b), std::end(b), '\0');
    char temp;

    temp=a[1];
    b[0]=temp;

    std::cout<<b;

}
#include <algorithm>
#include <iostream>

int main()
{
    std::string a = "ababababa";
    std::string b( 1, a[ 0 ] );

    std::cout<<b;

}