我的程序完全比较了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++);
}
答案 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)
您的函数中没有条件检查您从中派生的number
或z
。是什么让它停止?
答案 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直到它离开这个循环。