2014-01-14 35 views
0

我正在閱讀C primer Plus第5版,我在I/O章節中。我想出了一個例子(第451頁),它做了一些事情,並在某種程度上創建了一個新文件,該文件以現有文件命名,但以.red結尾。例如,如果我有這個文件「測試」,程序會創建一個「test.red」。我無法理解以下內容......命名與其他文件同名的文件

char name[LEN]; 
//some code... 

strncpy(name,argv[1], LEN - 5); 
name[LEN - 5] = '\0'; 
strcat(name,".red"); 

我看了命令strcpy的定義。它將arv [1](它包含源文件)中的第一個LEN-5字符複製到名稱。 strcat命令將.red添加到最後。但是,我不明白這個name[LEN - 5] = '\0';的存在。我刪除它,程序仍然運行良好。
編輯
我張貼評論從書中的這些行..

要輸出文件構建新的名稱,該程序使用 函數strncpy()渦流副本的名稱爲數組名。 LEN - 5 爲.red後綴和最終的空字符留下了空間。 如果argv [2]字符串長於LEN,則不會複製空字符,因此程序會添加空字符以防萬一。當strcat()函數追加字符串 (在本例中爲eddy.red)時,在strred()調用後名稱中的第一個空字符 然後在.red中被 句點覆蓋。

回答

1

在C中,字符串只是字符數組。要知道字符串的結束位置,在最後一個字符後面添加一個'\ 0'字符(字符代碼爲零的字符,在ASCII字母表中稱爲NUL字符)。

strncpy最多可以拷貝第三個參數給出的字符數,並且不能保證拷貝將以NUL終止。在設計strncpy時,存儲比今天更有限,甚至一個字節也很重要。因爲如果有人知道某個字符串的最大值爲14個字符,則可以存儲一個14個字符的字符串,而不包含終止的NUL字符。

所以,在使用strncpy時,如果要在其他C函數(如strcat)中使用字符串副本,則需要添加缺少的NUL字符,在這種情況下,strncpy不會複製它。

無論如何,如果從一開始就在那個地方出現NUL字符,但這不是你依賴的東西,或者編譯器會幫助你。

+0

明白了!謝謝! – yaylitzis