1. 程式人生 > >c++字元陣列未初始化及初始化後元素內容及其'\0'問題解析

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]
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];
}