2010-09-24 50 views
0

我試圖比較2個字符*相同的字符串,但其中一個包含一個空終止符在最後。 我一直在尋找通過互聯網,並理解,不建議刪除空終止符字符因爲它會使字符串不穩定。 我可以使用其他什麼方法?null終止符問題,而比較相同的字符*

比較功能:

int StringCompare(const char* str1, const char* str2) 
{ 
    int size1 = strlen(str1), size2 = strlen(str2), min = 0, index =0; 
    bool bigger1 = true; 
    if(size1>size2) 
     min=size2; 
    else 
     min=size1; 
    for(index=0;index<min;index++) 
    { 
     if(str1[index]>str2[index]) 
      return 1; 
     if(str1[index]<str2[index]) 
      return (-1); 
    } 
    if(size1==size2) 
     return 0; 
    if(min==size1) 
     return (-1); 
    else 
     return 1; 
}  

的感謝!

+4

你爲什麼要滾動你自己的StringCompare,在strings.h中找到strcmp? – t0mm13b 2010-09-24 16:41:17

+1

您遇到的問題到底是什麼? – sth 2010-09-24 16:43:23

+0

strcmp首先檢查長度,如果它們不同則返回它們不相同。 – 2010-09-24 16:48:17

回答

4

您正在使用strlen,其中要求在字符串末尾有一個空終止符。如果您通過的其中一個字符串沒有終止符,則保證失敗。

+0

什麼其他函數可以告訴我char *的大小? – 2010-09-24 16:45:19

+0

@shiran吧,有'sizeof'運算符,但這可能不是你想要的。你想達到什麼目的?如果你能澄清你的目標,我們可以更好地幫助你理解你需要做什麼。 – strager 2010-09-24 16:48:52

+1

@shiran吧,從C繼承的經典'char *'字符串按照定義結束爲null。你可以使用'std :: string'來代替長度作爲單獨的屬性,或者你可以將長度和字符串一起傳遞給函數。 – 2010-09-24 16:53:09

3

我希望你的char*字符串在末尾有空終止符!空終止符使得像strlen這樣的函數能夠確定長度,並知道字符串何時結束。

4

你對兩者都調用strlen,所以它們最好都在最後都有NUL(不是NULL)。一旦你到達NUL之一,你需要停止比較,因爲字符串已經完成了!而已!任何後續數據都不屬於該字符串。

2

您的代碼不可能工作,除非str1str2具有空終止符。否則,你(或strlen)怎麼知道他們是多久?

如果真正的問題是「我如何使用包含嵌入的NUL字符的字符串?」,你應該使用vector<char>或類似的。你不再談論字符串,因爲根據定義,字符串是NUL終止的。

4

請閱讀關於C字符串的此posting並理解它。所有c字符串都需要一個nul終止符來表示C運行時,字符串的末尾已經到達。 nul結束符是\0。注意nul和null之間的區別,以便清除任何潛在的混淆 - 在處理字符串時,它的nul,指針爲NULL!

+0

因爲你只是指另一篇文章(即使它是你自己的文章),我會建議你做出這個CW答案。 – strager 2010-09-24 16:45:34

5

使用std :: string,就是這樣。沒有常識,請使用strcmp()。

+0

+1好唔... – pm100 2010-09-24 17:40:56

2

如果你想比較2個字符串,但你不能確定它們都是空終止的,你的方法簽名需要將傳遞字符串的大小作爲參數,否則strlen會告訴你有多少字節從char *指針指向第一個存儲單元0.

3

如果您知道兩個字符串中的哪一個具有空終止符,則可以對其調用strlen()並將其用作這兩個字符串的長度。但這是一個可怕的黑客 - 你沒有真正比較任何東西。

假設你有兩個字符串:

"abc\0" 
"abcdef\0" 

是字符串2空值終止?或者是「def \ 0」部分只是隨機垃圾?

要確定的唯一方法是空終止所有字符串。

3

如果只有一個字符串是空終止的,則應該修改循環,以便在任何字符串都達到空值時結束並省略strlen()調用。

for(index=0;;index++) 
{ 
    if(!str1[index]) { 
     if(!str2[index]) 
      return 0; // strings are equal in length 
     return -1; // str1 < str2 since str2 is longer 
    } 
    if(!str2[index]) 
     return 1; // str1 > str2 since str1 is longer  

    if(str1[index]>str2[index]) 
     return 1; 
    if(str1[index]<str2[index]) 
     return (-1); 
} 

請注意,這與Matteo Italia的答案具有相同的效果。