2012-09-01 40 views
0

當我編譯並運行我的程序時,似乎一切正常,除了出現「運行時檢查失敗#2」錯誤,手頭的任務都正常。這是我的主要任務,這是我第一次嘗試使用任何cstring函數,所以我確信這是我出錯的地方。基本上,我將兩個字符串附加在一起,我幾乎100%確定它與我的結果參數超出範圍有關。只是不知道如何解決它。strncpy運行時檢查失敗#2錯誤C++

#include <iostream> 
#include <cstring> 
using namespace std; 

void concat(const char a[ ], const char b[ ], char result[ ], int result_maxlength); 
int main() 
{ 
    char a[] = "Woozle"; 
    char b[] = "Heffalump"; 
    char c[5]; 
    char d[10]; 
    char e[20]; 
    concat(a, b, c, 5); 
    concat(a, b, d, 10); 
    concat(a, b, e, 20); 
    cout << c << "\n"; 
    cout << d << "\n"; 
    cout << e << "\n"; 
    return 0; 
} 
void concat(const char a[ ], const char b[ ], char result[ ], int result_maxlength) 
{ 
strncpy (result,a, result_maxlength); 
strncat (result, b, result_maxlength); 
result[result_maxlength-1] = '\0'; 
} 
+1

這和你以前的問題有何不同? http://stackoverflow.com/questions/12217528/strncat-strncpy-help-c?rq=1 –

回答

1

到目前爲止,您有幾個與此代碼有關的問題。一個很少有人談論的非常微妙的是:根據POSIX規範,如果移動的非空字符數達到指定的限制('n'),則strncpy的行爲不會在您的字符串上設置空終止符。 )。但是,它會填充空值以達到'n'。因此:

char ar[3]; 
strncpy(ar, "food", sizeof(ar)/sizeof(ar[0])); 

這將最終有一個(0)= 'F',A(1)= 'o' 及AR(2)= 'O'。 將不會添加空終止符。忽略最後一個字符正是由於這個原因,人們對於調用這個運行時庫函數非常頭痛。考慮到這一點很重要。因此你會經常看到這樣的代碼。

char ar[3]; 
strncpy(ar, "food", sizeof(ar)/sizeof(ar[0])-1); 
ar[sizeof(ar)/sizeof(ar[0])-1] = 0; 

這可能會得到你真正想要的,即ar =「fo」。充足的空間情況反轉了這一點。如果你有一個有足夠空間的緩衝區,'n'將用空值填充直到'n'到達'n',如果副本的源字符串在到達'n'之前到達它自己的終止符。因此:

char ar[30]; 
strncpy(ar, "food", sizeof(ar)/sizeof(ar[0])-1); 
ar[sizeof(ar)/sizeof(ar[0])-1] = 0; 

將導致ar =「食物」,在'd'之後有二十六個零字符。保持他們的腳趾人,不那麼明顯的memset到零調用:

char ar[30]; 
strncpy(ar, "", sizeof(ar)/sizeof(ar[0])); 

沒錯,它就是錯了,我知道了。

所有這些被說成是毫不奇怪的,顯然strncat()的行爲不同於你的代碼似乎反映出你目前可能相信的。例如,最後一個參數不指定要在目標中限制的字符數。相反,它描述了限制從源複製的字符數量。換句話說,當你繼續使用新的琴絃時,尾部空間限制器應該不斷縮短。當然,要知道有多少涉及跟蹤每一步的複製字符,正如有人指出的那樣,這使得strncat在許多情況下無用,提供了比實用程序更多的困惑。

僅供參考,具有定義行爲的準確定義可在此處看到strncpystrncat。在繼續完成作業之前,我會強烈建議您清楚地閱讀兩者。

+0

非常感謝你!我需要這個清楚的解釋。我仍然是編程新手,但這意味着很多。 –

+0

完全沒有問題。樂意效勞。 – WhozCraig

1

strncat沒什麼用,因爲num參數不是目的地的總規模,它是要複製的字節數。

相關問題