0

我的程序完全比较了这两个字符串,并且一旦达到 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;

但是,当两个指针指向不同的数组(它们可能总是这样)时,这是未定义的行为。你需要做点别的事情。什么?我不知道,因为我不知道你的函数应该返回什么。

于 2012-02-14T22:43:04.840 回答
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 回答
0

您应该在每次迭代时更新 z ,然后检查它是否达到零,尝试将其添加到您的代码中:

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

此外,您所做的检查确实有问题,如果它有效,它可能会在不需要的时间停止,例如在字符串“abcdec”和“xxcddc”上,其中数字 = 6,它会在 3 处停止,因为字符在这些索引与索引 6 上的索引相同。

非常彻底地重新阅读您的代码,并确保您在考虑任何这些答案之前真正理解它。

于 2012-02-14T22:45:02.703 回答
0

您的函数中没有检查numberz从中派生的条件。什么会让它停下来?

于 2012-02-14T22:35:22.943 回答
0

假设循环还没有中断,你为什么不简单地减少数字并在它达到 0 时中断

于 2012-02-14T22:39:54.280 回答
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。

于 2012-02-14T23:26:38.500 回答