簡體   English   中英

為什么只有在未指定字符串長度的情況下,printf才將兩個變量連接在一起?

[英]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函數將不知道何時停止打印您的字符串,因此它將繼續myagemyage數組之后的下一個內存位置,該位置恰好是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM