#include <stdio.h>
#include <string.h>
int main(int argc, const char * argv[]) {
int i;
char s1[100] = "Computer Programming Class";
char s2[100] = "ECE";
int length = (int)strlen(s1);
for (i = 0; i < length; i ) {
s2[i] = s1[length - 1 - i];
}
s2[i] = '\n';
printf("%s", s2);
return 0;
}
這是我的一項測驗,我不明白為什么它按預期作業。就是把s1的順序顛倒后存入s2然后列印出來的一段代碼。在我看來,當 s1 向后存盤時,s2 中的空字符將被覆寫,而且 s1 中的空字符永遠不會寫入 s2,因為它是從最后一個字符開始的。但它列印出來就好了。為什么?
uj5u.com熱心網友回復:
strlen以字符形式回傳字串的長度,不包括空終止符,因此i < length在其迭代中不包括空終止符s1當您部分初始化陣列時,就像您
char s2[100] = "ECE";對其余元素所做的那樣,已經初始化為零。換句話說,您的寫入s2只要length < 99保證以空值終止。
uj5u.com熱心網友回復:
來自 C 標準(6.7.9 初始化)
21 如果花括號括起來的串列中的初始值設定項少于集合的元素或成員數,或者用于初始化已知大小陣列的字串文字中的字符少于陣列中的元素數,則集合的剩余部分應與具有靜態存盤持續時間的物件一樣隱式初始化。
和
10 如果沒有明確初始化具有自動存盤期的物件,則其值是不確定的。如果沒有顯式初始化具有靜態或執行緒存盤持續時間的物件,則:
——如果是指標型別,則初始化為空指標;
——如果它有算術型別,它被初始化為(正或無符號)零;
— 如果是聚合,則根據這些規則(遞回地)初始化每個成員,并將任何填充初始化為零位;
— 如果是聯合,則根據這些規則(遞回地)初始化第一個命名成員,并將任何填充初始化為零位;
因此在這個宣告中
char s2[100] = "ECE";
未由字串文字的元素顯式初始化的所有 96 個元素都被隱式初始化為零。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/386831.html
