C++ 使用char将一个char数组分配给另一个char数组时的奇怪行为
当我尝试将一个元素从char数组复制到一个char数组,然后从同一个char数组复制到另一个char数组时,第二个char数组会给出奇怪的输出,通常包含第一个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;
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运算符,该运算符通过扫描字符串直到找到空字符来确定字符串的长度。由于数组不包含空字符,它会一直读取数组的末尾,直到它在其他地方碰巧找到空字符。在您的情况下,编译器似乎有存储空间da
在堆栈中的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;
}