本文目錄一覽:
C語言初始化字符型數組時,兩種方式的區別?
左圖的程序是a和b初始化時都被賦值為字符串,它們的最後都有字符’\0’,有了這個標誌,求字符串長度和輸出字符串時都能得到正確的結果。
右圖的程序a的初始化賦值仍然是字符串,所以它的輸出也是正確的。而b的初始化使b成為一個“字符數組”,它的最後沒有字符串結束符,系統也不會主動加上。所以,當後面你用字符串操作函數strlen和字符串格式符%s輸出b時,系統會一直往後找,直到找到一個’\0’時,系統便認為,這就是字符串結束的地方,故,輸出的字符串長度和字符串本身都是錯誤的。
b除了所以與a相同的初始化方式,或者應該用下面的語句:
b={‘a’,’b’,’w’,’f’,’\0′};
就能成為字符串了。
c語言的字符串數組初始化問題
你申請數組空間後,內存中存放字符的順序是:
str1[0],str1[1],str1[2],str1[3],str1[4],str2[0],str2[1],str2[2],str2[3]
當輸入字符串是:abc 123時,存儲的數據str1[0]~str1[4],str2[0]~str2[3]為:
‘a’,’b’,’c’,0,xx,’1′,’2′,’3′,0
其中,xx表示一個不關心的任意值,也就是說輸入字符串”abc”需要佔用4個字節的存儲空間
當輸入字符串1為”abcde”時,存儲的數據為:’a’,’b’,’c’,’d’,’e’,0,xx,xx,xx
字符串末尾的0已經超出了str1開設的存儲空間而存放到了str2[0]位置
接着再輸入字符串”1234″時,str2[0]的str1字串的結尾符被字符’1’覆蓋,
存儲的數據為:’a’,’b’,’c’,’d’,’e’,’1‘,’2‘,’3‘,’4‘,0
而且由於str2輸入字符數為4個其佔用空間也超出了str2的空間範圍,那麼上邊存儲的0值也不知道覆蓋了什麼變量的位置,導致其他變量的值被衝掉了。
當執行printf(“%s\n”,str1);時,printf從str1[0]開始輸出的字符串(遇0結束輸出)為abcde1234
當執行printf(“%s\n”,str2);時,printf從str2[0]開始輸出的字符串(遇0結束輸出)為1234
所以你輸入的第1個字符串字符數少於5時,存儲不會溢出,多於4個時,末尾的0就會被輸入的str2所覆蓋而失效,且多於5的字符也會被覆蓋。scanf並不能保證輸入字符的長短不會溢出,你應當在設計程序時考慮到這點,預先定義足夠的字符串保存空間或用其他方法來避免這個問題的出現。
C語言字符數組如何初始化?
C語言允許用字符串的方式對數組作初始化賦值。例如:
static char c[]={‘c’,’ ‘,’p’,’r’,’o’,’g’,’r’,’a’,’m’}; 可寫為:
static char c[]={“C program”}; 或去掉{}寫為:
static char c[]=”C program”;
當對全體元素賦初值時也可以省去長度說明。例如:static char c[]={`c`,` `,`p`,`r`,`o`,`g`,`r`,`a`,`m`};這時C數組的長度自動定為9。
擴展資料:
數組的使用規則:
1.可以只給部分元素賦初值。當{ }中值的個數少於元素個數時,只給前面部分元素賦值。例如:static int a[10]={0,1,2,3,4};表示只給a[0]~a[4]5個元素賦值,而後5個元素自動賦0值。
2.只能給元素逐個賦值,不能給數組整體賦值。例如給十個元素全部賦1值,只能寫為:static int a[10]={1,1,1,1,1,1,1,1,1,1};而不能寫為:static int a[10]=1;請注意:在C、C#語言中是這樣,但並非在所有涉及數組的地方都這樣,數據庫是從1開始。
3.如不給可初始化的數組賦初值,則全部元素均為0值。
4.如給全部元素賦值,則在數組說明中, 可以不給出數組元素的個數。例如:static int a[5]={1,2,3,4,5};可寫為:static int a[]={1,2,3,4,5};動態賦值可以在程序執行過程中,對數組作動態賦值。這時可用循環語句配合scanf函數逐個對數組元素賦值。
參考資料:
百度百科-數組
c語言字符數組初始化
如果是定義的全局,變量字符數組可以不用初始化因為全局變量會自動初始化為0值。如果是局部變量可以在定義的時候就給他初始化,也可以在定義完成以後,再用一個循環對他的所有元素進行初始化。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/191972.html