2009-07-24 52 views
4

我使用下面strncpy()函數和使用的sizeof

char call[64] = {'\0'} /* clean buffer */ 
strncpy(call, info.called, sizeof(call)); 

代碼複製最多字符我總是用sizeof運算爲目標的保護溢出,櫃面源比目標更高。這樣我可以防止緩衝區溢出,因爲它只會複製到目標可以處理的程度。

但我現在想知道它是否會終止目的地。

一些情況。

1)如果來源較大。 我可以這樣做:

call[strlen(call) - 1] = '\0'; /* insert a null at the last element.*/ 

2)如果源小於目標。 調用是64字節,我複製50個字節,因爲這是源的大小。它會自動將null放在51元素中嗎?

非常感謝的任何信息,

回答

4

被調用strlen()如果光源的長度爲小於作爲第三個參數傳遞的最大數量strncpy將無效終止目標,否則 - 不是。

如果來源的長度等於或大於目的地 - 這是您處理它的問題。像你一樣建議 - 調用strlen() - 將不起作用,因爲緩衝區不會以null結尾,而且會遇到未定義的行爲。

你可以分配一個更大的緩衝:

char buffer[bufferSize + 1]; 
strncpy(buffer, source, bufferSize); 
*(buffer + bufferSize) = 0; 
4

你的點子:

call[strlen(call) - 1] = '\0'; 

是行不通的,因爲你會在非結尾的字符串

12

strncpy空終止目標,如果它截斷字符串。如果必須使用strncpy,你需要確保結果被終止,是這樣的:

strncpy(call, info.called, sizeof(call) - 1); 
call[sizeof(call) - 1] = '\0'; 

BSD的strlcpy(),等等,被普遍認爲是優於:

http://www.openbsd.org/cgi-bin/man.cgi?query=strlcpy

+0

一個簡單的方法來確保目的地nul終止在這裏是做call [sizeof call -1] = 0; – nos 2009-07-24 10:05:07

+0

我不認爲strncpy會終止字符串。通過不終止字符串。這會導致一個真正的問題嗎?也可以通過調用[strlen(info.called - 1] ='\ 0');如果源代碼大於或小於目的地,終止的正確方法是什麼?謝謝。 – ant2009 2009-07-24 10:10:20

+0

是的,一個未終止的字符串會導致` strlen()`,`strcat()`等錯誤,損壞內存和/或崩潰。當字符串比目標短時,將緩衝區的最後一個字節設置爲零不會造成任何損害。 – 2009-07-24 10:13:06

1

但我我現在想知道它是否會終止目的地。

不,strncpy不保證目標字符串會被空終止。

char tar[2]={0,0}; 
char bar="AB"; 
strncpy(tar,bar,2); 
// result tar[0]=='A'; tar[1]=='B' 

它以使其糾正你應該使用:

strncpy(traget,string,sizeof(target)-1); 
target[sizeof(target)-1]=0 
1

1)從cplusplus.com:「沒有空字符隱式添加到目的地的結束,所以目標只會是空值如果源中C字符串的長度小於num,則終止。「所以,你如果你需要你的字符串是空終止的,你需要做的是:

call[sizeof(call) - 1] = '\0'; 

一個好辦法做到這一點是寫爲strncpy包裝函數始終確保該字符串被終止。

2)如果源比目標短,則目標將以空終止。

0

只需使用strlcpy()而不是strncpy()。 您必須檢查它是否適用於所有平臺。 早期版本的linux可能沒有它。