0

私のプログラムは 2 つの文字列を完全に比較し、文字数が 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

6 に答える 6

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;

ただし、2 つのポインターが異なる配列を指している場合 (おそらく常にそうなります)、これは未定義の動作です。あなたは何か他のことをしている必要があります。何?関数が何を返す必要があるのか​​わからないため、わかりません。

于 2012-02-14T22:43:04.840 に答える
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はあなたの隣人です。あなたが見ている家に1つ追加すると、mystring1はあなたの隣人を指しています。そして、zはまだあなたが+1を指していることを言っているので、zは彼の隣人を指しています。

于 2012-02-14T23:26:38.500 に答える
0

ループがその時点までに壊れていないと仮定して、単純に数値を減らして0に達したときにブレークしないのはなぜですか

于 2012-02-14T22:39:54.280 に答える
0

numberを調べる、またはzそこから派生する関数に条件がありません。何がそれを止めるでしょうか?

于 2012-02-14T22:35:22.943 に答える
0

ありがとうございます...エラーを修正しました...whileループに別の条件を追加しました。

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

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

そして、このループから抜けるまで i をインクリメントします。

于 2012-02-15T15:06:09.413 に答える