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<cout<<"end"<//以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</输出结果为: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<
        cout<cout<for(int i=0;i<200;i++)
    {

        cout<<(int)a[i]<<' ';
    }
}
/*
输出结果:
    第一行为乱码
    第二行,前五个数为abcde的ASCII码,其余数为随机数
*/

如果想将字符数组的值全部设置为’\0’,可以使用memset函数,这样就可以达到相当于在main函数外面申请字符数组的效果。

#include  //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<//结果为: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<return 0;
    结果为:
    0
    1
    2
    3
    4
    5
    6
    7
    8
    9
}

这样只要对数组进行连续赋值,便很容易通过下列代码遍历输出整个字符数组,而不用管数组的长度为多少:

int i=0;
while(a[i]!='\0')
{
    cout<

你可能感兴趣的:(C/C++)