2

我有这个任务来实现 strcmp 函数。有时它运行正常,但有时它会崩溃。请帮我。

#include <iostream>

using namespace std;     

int mystrcmp(const char *s1, const char *s2);

int main()
{
cout<<mystrcmp("A","A")<<endl;     
cout<<mystrcmp("B","A")<<endl;     
cout<<mystrcmp("A","B")<<endl;     
cout<<mystrcmp("AB","A")<<endl;

return 0;     
}

int mystrcmp(const char *s1, const char *s2)
{
 while (*s1==*s2)
 {
  s1++;
  s2++;
 }

 if(*s1=='\0')
  return(0);

 return(*s1-*s2);
}
4

4 回答 4

10

如果两个输入相同,它将崩溃,因为您的循环继续超出终止nul字符。

要解决此问题,您必须在循环nul检查字符:

while (*s1==*s2) {

  // if s1 points to nul character, then s2 should also, because of the ==
  // which means we've reached the end of the strings and they are equal
  // so return 0.
  if(*s1=='\0')
    return 0;

  s1++;
  s2++;
 }

 return *s1-*s2;
于 2010-10-19T04:24:33.343 回答
3

mystrcmp会很高兴地跑出字符串的末尾,因为你对 NUL 终止符的测试在循环之外。如果字符串相同,则*s1*s2都是 0 并且循环继续进行。

于 2010-10-19T04:22:49.693 回答
3
while (*s1==*s2)
{
 s1++;
 s2++;
}

'\0' == '\0'

于 2010-10-19T04:23:10.150 回答
1

您需要考虑如果您的两个字符串如下所示会发生什么:

s1:this is a string\0|abcdef
s2:this is a string\0|abcdef
       good memory <-|-> bad memory

因为您只是在内容相等时推进指针,所以您最终可能会以未定义的方式读取内存。

更好的方法是基于以下伪代码的代码:

def strcmp(s1,s2):
    while character at s1 is not '\0':
        if character at s1 is not the same as character at s2:
            exit while loop
        increment s1 and s2
    return difference between *s1 and *s2

当您到达第一个字符串的末尾或发现差异时(包括您是否在第一个字符串之前到达第二个字符串的末尾),这将停止。

于 2010-10-19T04:25:22.453 回答