开发者

C++ program crashes

I've this assignment to implement strcmp function. Sometimes it runs okay but other times it crashes. Please help me.

#include <iostream>

using namespa开发者_Python百科ce 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);
}


It will crash if both the input are identical, because your loop continues beyond the terminating nul character.

To fix this you must have a check for nul character inside the loop as:

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;


Your mystrcmp will happily run off the end of the string, because your test for the NUL terminator is outside the loop. If the strings are the same, then both *s1 and *s2 are 0 and the loop keeps going.


while (*s1==*s2)
{
 s1++;
 s2++;
}

'\0' == '\0'


You need to think what will happen if your two strings are as follows:

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

Because you're simply advancing the pointers while the contents are equal, you may end up reading memory in a way that's undefined.

A better way is to base your code of the following pseudo-code:

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

This will stop when you either reach the end of the first string or you find a difference (including if you've reached the end of the second string before the first).

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜