strncmp函数不会停止检查n个字符?

时间:2012-02-14 22:33:38

标签: c cstring strncmp

我的程序完全比较了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++);
    }

6 个答案:

答案 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;

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

为什么不简单地减少数字并在数字达到0时中断,假设循环没有被那个点破坏

答案 3 :(得分:0)

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

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

此外,检查你有没有真正的错误,如果它工作,它可以在不需要的时间停止,例如在字符串“abcdec”和“xxcddc”,其中数字= 6,它将停在3,因为这些索引处的字符与索引6上的字符相同。

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

答案 4 :(得分: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。

答案 5 :(得分:0)

谢谢大家...我修复了错误...为while循环添加了另一个条件。

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

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

然后递增i直到它离开这个循环。