2012-02-14 72 views
0

我的程序完全比較了兩個字符串,並且在n個字符到達後不會停止?爲什麼會發生?strncmp函數不會停止檢查n個字符?

int strncompare (const char* mystring1,const char* mystring2, int number) 
{ 
    int z; 
    z = number - 1; 
    while ((*mystring1==*mystring2) && (*mystring1 != '\0') && (*mystring2 != '\0')) 
    { 
     *mystring1++; 
     *mystring2++; 
     if ((*mystring1 == mystring1[z]) && (*mystring2 == mystring2[z])) 
     { 
      break; 
     } 
    } 
    return (mystring1++ - mystring2++); 
    } 
+4

因爲你,當你比較'number'字符不停止?另外你爲什麼要做'* mystring1 ++;'?你不需要'*'。在繼續之前,請閱讀一本好的C++書。 – 2012-02-14 22:36:23

+1

與您的問題沒有直接關係,但您認爲'* mystring1 ++;'和'* mystring2 ++;'做了什麼?我猜這不是他們實際做的。 – hvd 2012-02-14 22:36:34

+1

@SethCarnegie的'如果((* mystring1 == mystring1 [Z])&&(* mystring2 == mystring2 [Z]))'應該檢查的是,但是檢查結果是錯在其邏輯和它的實現。 – hvd 2012-02-14 22:37:46

回答

0

您的功能檢查number,或z,你從中獲得任何條件。什麼會使它停止?

+0

'如果((* mystring1 == mystring1 [Z])&&(* mystring2 == mystring2 [Z]))'似乎* *旨在停止在位置'z'('number'-1)。是的,我知道檢查是錯誤的,但我找不到解釋它的答案。 – hvd 2012-02-14 22:39:23

0

你爲什麼不乾脆遞減數,當它到達0假設循環還沒有到那個時候

1

打破,因爲你當你比較number字符不停止打破。

有幾種方法可以做到這一點,但我會建議改變你的循環條件

while (*mystring1 && *mystring2 && *mystring1 == *mystring2 && number-- > 0) 

同時刪除

if ((*mystring1 == mystring1[z]) && (*mystring2 == mystring2[z])) 
{ 
    break; 
} 

因爲,雖然好像這是你的企圖使它停止,它的編碼錯誤;你不在乎字符是否相同,你只關心你是否比較過number個字符。你也使用&&這使得條件比以前更嚴格。

而且改變

*mystring1++; 
*mystring2++; 

mystring1++; // or better, ++mystring1 
mystring2++; // or better, ++mystring2 

*取消引用指針,但你沒有做任何事的,因此是毫無意義的(雙關語意)。

您還可以刪除從這些++

return (mystring1++ - mystring2++); 

因此,這將是

return mystring1 - mystring2; 

然而,這是不確定的行爲,當這兩個指針指向不同的陣列(他們可能總是將)。你需要做其他事情。什麼?我不知道,因爲我不知道你的函數應該返回什麼。

0

你應該在每次迭代更新Z和再檢查,如果它達到零,你可以添加以下到您的代碼:

if (z == 0) 
    break; 
else 
    z -= 1; 

同樣,檢查你真的是有錯誤的,如果它的工作可能停止在不需要的時間,例如在字符串「abcdec」和「xxcddc」上,其中number = 6,它將停在3,因爲這些索引處的字符與索引6處的字符相同。

Re-仔細閱讀你的代碼,在考慮任何這些答案之前,確保你真的瞭解它。

0

這將走直到它發現一個區別,或字符串的結尾。

while(n > 0) { 
    if(*str1 != *str2 || *str1 == '\0'){ 
      return *str1 - *str2;; //they're different, or we've reached the end. 
    } 
    ++str1; //until you understand how ++ works it's a good idea to leave them on their own line. 
    ++str2; 
    --n; 
} 
return 0;// I originally had *str1 - *str2 here, but what if n came in as zero.. 

z比較的問題是它是一個移動的目標。 想起[]作爲+號.. mystring1 [Z]可以表示這樣*(mystring1 + Z) 這意味着++ mystring1上面的行; (因爲它應該是)正在移動指針,從而移動z正在尋找..

它可能有助於想象指針作爲街道上的地址..當你++你搬家了.. 說z = 1 .. mystring1指向的房子是你的,z是你的鄰居。添加一個到你要找的房子,現在mystring1在你的鄰居的指點下,和Z在他的鄰居指着因爲Z仍然說什麼你指着+ 1

+0

你不需要測試兩個str的0 ..如果str2爲零但str1不是,那麼!=將評估爲真。 – baash05 2012-02-14 23:47:35

0

感謝所有...我固定錯誤...給while循環添加了另一個條件。

int i; 
i=0; 
z = number - 1; 

while((*mystring1==*mystring2) && (*mystring1 !='\0') && (*mystring2 !='\0') && (i<z)) 

然後遞增我,直到它出現這個循環。

+0

我也改變了返回(* mystring1- * mystring2) – 2012-02-15 15:10:41