c++字元陣列未初始化及初始化後元素內容及其'\0'問題解析
阿新 • • 發佈:2019-02-10
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];
}