2012-02-13 98 views
0

的情況下1:字符*性病字符串錯誤的結果比較

std::string dd = "5A" 
char checkSum[9] 
checkSum[0] = '5'; 
checkSum[1] = 'A'; 
if(strcmp(dd.c_str(),checkSum) == 1){ 
return 1; 
} 
else {return 0;} 

結果:返回1 //正確!

的情況下2:

std::string dd = "0A" 
char checkSum[9]; 
checkSum[0] = '5'; 
checkSum[1] = 'A'; 
if(strcmp(dd.c_str(),checkSum) == 1){ 
return 1; 
} 
else {return 0;} 

結果:返回0 //正確!

的情況下3:

std::string dd = "5A"  
char checkSum[9]  
checkSum[0] = '0'; 
checkSum[1] = 'A'; 
if(strcmp(dd.c_str(),checkSum) == 1){ 
return 1; 
} 
else {return 0;} 

結果:返回1 //不正確!

任何人都知道什麼是錯的?謝謝!

+0

請張貼真實的代碼,並煞費苦心地正確格式化。請編輯該問題。 – 2012-02-13 09:12:11

回答

7

strcmp需要兩個以空字符結尾的字符串,但是您沒有向checkSum添加空終止符。

這就是爲什麼情況1返回1實際上它應該返回0。請注意您的預期值不正確。在情況1中,一旦你添加了null-terminator,兩個字符串應該相等。所以strcmp將返回0,您的代碼也應該返回0

對於情況2,strcmp("0A", "5A")返回負值,因爲'0'<'5'因此您的代碼應該返回0

對於情況3,strcmp("5A", "0A")返回一個正值,而恰好如此,正值是1,您錯誤地通過平等測試。

在所有情況下,測試的值爲1不正確,因爲strcmp從不承諾返回1。它承諾將在回報:

  • 0值,表明兩個字符串相等,或
  • 正值,表明str1比較比str2更大,或
  • 負值以指示str1比較小於str2。因此

上的strcmp返回值的唯一有效的比較是==0>0<0

您需要重新訪問strcmp的文檔,並更正您對如何解釋返回值的理解。

+0

這是正確的,但它不是* case 3 *代碼的行爲令OP感到意外的原因。 – 2012-02-13 09:20:14

+0

@Antonio不,我想我現在得到了。問題中的預期值不正確。 – 2012-02-13 09:21:09

+0

。@ David,你現在明白了:) – 2012-02-13 09:36:36

1

您的校驗和包含未定義的數據,您不會在其中添加'\ 0'終止字符。如果你調用strcmp,這是意想不到的行爲。你可以聲明你的校驗和爲: char checkSum [9] = {0}; 但更好的解決方案是避免不安全的字符數組,請改用std :: string。

0

你也應該永遠與別的接零比較strcmp的結果作爲

strcmp(s1, s2) == 0 
strcmp(s1, s2) > 0  
strcmp(s1, s2) < 0 
strcmp(s1, s2) != 0 

爲標準不guerantee一個1(或-1)在有差異的情況下。