c++字符数组未初始化及初始化后元素内容及其'\0'问题解析

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]
abcde\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];
}
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值