[英]How will 'fopen' interpret a 'char[]' whose capacity is larger than the string it contains?
我正在編寫一個可以加密文本文件的程序。
首先,我需要向用戶詢問文件名。 我做了類似的事情:
char file_name[50];
fgets(file_name, 50, stdin);
但這沒用。 我怎樣才能做到這一點?
如果將文件名存儲在具有50個元素的char數組中,但是文件名只有10個字符,我感到困惑。 當我將數組或指針傳遞給fopen
,程序將與該數組的其余40個元素做什么? 他們存儲任何價值嗎? 他們會被傳給fopen
嗎?
在C語言中,字符串只是\\0
終止的字符序列。 只要在file_name
的50個字節中有一個\\0
, file_name
包含fopen()
的有效字符串。
fopen()
可能失敗的原因是,您通過它輸入的名稱從輸入中讀取后,其中包含了一個額外的\\n
。 這是因為fgets()
還將換行符存儲到緩沖區中。 您必須先刪除它,然后再使用字符串作為文件名。
char *p = strrchr(file_name, '\n');
if (p) *p = '\0';
我很困惑,如果我將文件名存儲在具有50個元素的char數組中。 但是文件名只有10個字符。 當我將數組或指針傳遞給fopen()函數時,程序將如何處理該數組的其余40個元素?
你是說剩下的38對吧? 第11個字符將是換行符fgets()
放入緩沖區,第12個字符被分配為NUL( '\\0'
)字符。
其余的一切都不會做。
他們存儲任何價值嗎? 將它們傳遞給fopen()嗎?
顯然,它們存儲着一些不確定的和無關緊要的價值。 不,它們不會傳遞給fopen()
。 實際上,所有字符都不會傳遞給fopen()
。 當您使用數組作為函數的參數時,它會自動衰減為指向其第一個元素的指針,而fopen()
只能看到該指針。
在內部, fopen()
最有可能使用open()
系統調用(至少在Unices上)實現,並且由於幾乎每個函數都接受C字符串,因此它將通過搜索NUL終止符並假設該條件來解釋指針。文件名由不超過'\\0'
字符的字符組成(但不包括)。
fopen
將逐字符檢查字符串,直到遇到\\0
,然后停止。 因此,只要從前10個字符加上后綴\\0
構成有效的字符串,您就可以從fgets
獲得的其余字符串無關緊要。
還要注意,您需要從fgets
獲得的字符串中刪除多余的\\n
。
C中的字符串只是內存中的字符,后跟一個空字節。 例如:
'H' 'e' 'l' 'l' 'o' ',' ' ' 'w' 'o' 'r' 'l' 'd' '!' '\0'
48 65 6C 6C 6F 2C 20 77 6F 72 6C 64 21 00
將數組傳遞給fopen
的filename參數時,它會衰減為指針。 本質上, fopen
會執行的操作是使用不超過null字節的字符。 此后的任何內容都不會被觸及。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.