簡體   English   中英

'fopen'將如何解釋容量大於其包含的字符串的'char []'?

[英]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個字節中有一個\\0file_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.

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