簡體   English   中英

C中的strcpy和sprintf

[英]strcpy and sprintf in C

我試圖設置一些這樣的字符串變量:

char thingA[7], thingB[7], thingC[7];
strcpy(thingA, "StringA");
strcpy(thingB, "StringB");
strcpy(thingC, "StringC");
printf("%s\n", thingA);
printf("%s\n", thingB);
printf("%s\n", thingC);

但是不要像這樣輸出:

StringA  
StringB  
StringC  

它輸出如下:

StringA StringB StringC  
StringB StringC  
StringC 

我已經嘗試過sprintf ,但得到相同的結果。 老實說,我不知道發生了什么或如何解決此問題,而且我在網上也找不到任何東西,因為出於某種原因,搜索這類東西已被證明很困難。 那么,基本上為什么將字符串b和c存儲在a中,而將c存儲在b中呢?

常見錯誤:您的聲明短了一個字節。 如果計算常量字符串中的字符,則為7,並且您需要空格來終止'\\0' ,否則將覆蓋內存並獲得未定義的行為。

因此,將它們聲明為[8] ,它將起作用。

該代碼的問題是,您在C中的字符串以null終止( \\0 ),因此StringA盡管具有7個可打印字符,但實際上需要8個字符來存儲。 這三個char數組在堆棧上背靠背,因此覆蓋終止null字符將導致它們被串聯。 指向char數組的每個指針均以不同的偏移量開頭,因此, thingBthingC字符串較短,但是在所有情況下, printf都會讀取該字符串,直到在thingC的末尾找到空字符為止。

請注意,這是一個經典的緩沖區溢出錯誤,您很幸運在thingC之后的堆棧上有一個空值,否則printf可以繼續讀取和打印內存的時間更長。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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