![](/img/trans.png)
[英]Why won't this printf() statement print two string variables in C?
[英]Why does printf concatenate two variables when outputing, but only if the length of the string is not specified?
任何人都知道為什么printf在輸出時將這兩個變量連接在一起,但是僅當未指定字符串的長度時才如此?
#include <stdio.h>
int main(){
char myname[3] = "tim";
char myage[3] = "ten";
printf("myname is:%s \n", myname);
printf("myage is:%s \n", myage);
}
我的名字是:蒂姆
Myage是:帳篷
...但是當我不指定字符串的長度時,它似乎可以按我的預期工作,而無需打印兩個變量。
#include <stdio.h>
int main(){
char myname[] = "tim";
char myage[] = "ten";
printf("myname is:%s \n", myname);
printf("myage is:%s \n", myage);
}
我的名字是:蒂姆
賠率是:十
您聲明數組的大小為3
但是嘗試在其中存儲4
元素。 由於只有3
元素有足夠的內存,最后一個元素( 字符串null終止符\\0
)沒有剩余的存儲空間,因此您的字符數組中沒有null終止符。
請注意,c中的字符數組應以null終止,以便您可以使用printf
打印它們。 這是因為printf
只是遍歷字符數組,直到遇到\\0
為止。 在您的第一個示例中,由於數組從未被\\0
終止,您最終得到的是未定義的行為。( 實際上, pintf
會一直打印直到遇到\\0
並在此過程中讀取超出分配給數組的內存范圍 )
在第二種情況下,由於您沒有自行指定大小,因此根據字符串中指定的元素數(即4和\\0
終止位置)來選擇適當的大小。
您沒有在數組中留出足夠的空間來容納空終止符。 在C語言中,當您使用長度完全相同的字符串初始化char數組時,將刪除空終止符。
char myname[3] = "tim"; // equivalent to char myname[3] = {'t','i','m'};
char myage[3] = "ten"; // equivalent to char myage[3] = {'t','e','n'};
如果沒有空終止符,printf函數將不知道何時停止打印您的字符串,因此它將繼續myage
到myage
數組之后的下一個內存位置,該位置恰好是myname
數組的存儲空間。 堆棧可能看起來像這樣:
t <- beginning of myage
e
n
t <- beginning of myname
i
m
\0 <- a null terminator, by coincindence.
名稱后面沒有其他垃圾,這只是一個巧合。 任何東西都可能存儲在myname
數組之后,但是在您的情況下,它是一個空字符,因此printf停止了打印。
如果未為數組指定大小,則選擇一個比字符串長度大一的大小,以便可以存儲空終止符:
char myname[] = "tim"; // equivalent to myname[4] = {'t','i','m','\0'};
char myage[] = "ten"; // equivalent to myage[4] = {'t','e','n','\0'};
現在,將空終止符顯式放置到位,並且堆棧如下所示:
t <- beginning of myage
e
n
\0 <- explicit null terminator
t <- beginning of myname
i
m
\0 <- explicit null terminator.
現在,printf函數確切知道何時停止打印。
%s
指令對應於指向字符串的參數。 字符串是一個以第一個'\\0'
結尾的字符序列。 但是,您沒有為第一個示例中的數組留出足夠的空間來容納'\\0'
,因此這些數組不包含字符串。
printf認為字符串存在,並繼續打印字符,直到出現在字符串末尾的'\\0'
字符為止。 如前所述,沒有'\\0'
字符,因為沒有空格。 您的代碼使printf訪問數組邊界之外的字節,這是未定義的行為。
myname[3]
和myage[3]
假設有一個終止\\0
的地方。 因此,您實際上只能在每個數組中存儲2個符號。
在第二種情況下,編譯器會自動將大小設置為4
,足以存儲字符串。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.