1、字符数组未初始化之前,里面的值是什么?
(1)字符数组定义在main函数外面,a[i]的值为’\0’(i=1,2,3…),(int)a[i]的值为0。
int a[5] ,则:
a[0] | a[1] | a[2] | a[3] | a[4] |
---|---|---|---|---|
\0 | \0 | \0 | \0 | \0 |
char a[5];
int main(){
for(int i=0;i<5;i++)
{
if(a[i]=='\0')
{
cout<<'b';
}
}
}
//结果为bbbbb
(2)字符数组定义在main函数里面,(int)a[i]的值为随机数,输出结果表现为乱码
int main(){
int a[10];
for(int i=0;i<10;i++)
{
cout<<a[i];
}
cout<<"end"<<endl; //以end标记输出结束位置,输出会有空格
for(int i=0;i<20;i++)
{
cout<<(int)d[i]<<' ';
}
}
/*结果为:
第一行为乱码:
v@ end
第二行为一组随机数字:
13 118 5 49 8 -89 -128 18 64 0
因为每次运行程序,对数组a分配的空间不同,生成的随机数不同
故运行结果也不同。
*/
2、字符数组在部分初始化后,后面的元素自动赋值为’\0’
例如:
int main (){
char a[10]="abcde";
//char a[10]={"abcde"};
//char a[10]={'a','b','c','d','e'}; //三种初始化方式都一样
for(int i=0;i<10;i++)
{
if(a[i]=='\0')
{
cout<<'0';
}else{
cout<<a[i];
}
}
}
//输出结果为:abcde00000
数组内容如下表:
a[0] | a[1] | a[2] | a[3] | a[4] | a[5] | a[6] | a[7] | a[8] | a[9] |
---|---|---|---|---|---|---|---|---|---|
a | b | c | d | e | \0 | \0 | \0 | \0 | \0 |
注意:
int main() {
char a[100];
a[0]='a'; //这种类型不属于初始化,而是赋值
a[1]='b'; //等价于未初始化的数组,将其前五个数进行了赋值
a[2]='c'; //其余元素仍为乱码
a[3]='d'; //输出(int)a[i]为随机数(前五个数为abcde的ASCII码)
a[4]='e';
for(int i=0;i<200;i++)
{
/* if(a[i]=='\0')
{
cout<<'0';
}else{
cout<<a[i];
}
*/
cout<<a[i];
}
cout<<endl;
for(int i=0;i<200;i++)
{
cout<<(int)a[i]<<' ';
}
}
/*
输出结果:
第一行为乱码
第二行,前五个数为abcde的ASCII码,其余数为随机数
*/
如果想将字符数组的值全部设置为’\0’,可以使用memset函数,这样就可以达到相当于在main函数外面申请字符数组的效果。
#include<cstring> //memset函数需要包含的头文件
int main (){
char a[10];
memset(a,'\0',sizeof(a));
for(int i=0;i<100;i++)
{
if(a[i]=='\0')
{
cout<<'0';
}else{
cout<<a[i];
}
}
//结果为:0000000000
}
结果如下:
a[0] | a[1] | a[2] | a[3] | a[4] | a[5] | a[6] | a[7] | a[8] | a[9] |
---|---|---|---|---|---|---|---|---|---|
\0 | \0 | \0 | \0 | \0 | \0 | \0 | \0 | \0 | \0 |
这里还有一个更简单的方法初始化字符数组:
int main () {
char a[10]={0}; //从一开始就全部赋值为0
for(int i=0;i<10;i++)
{
if(a[i]=='\0')
{
cout<<i<<endl;
}
}
return 0;
结果为:
0
1
2
3
4
5
6
7
8
9
}
这样只要对数组进行连续赋值,便很容易通过下列代码遍历输出整个字符数组,而不用管数组的长度为多少:
int i=0;
while(a[i]!='\0')
{
cout<<a[i];
}