С ++ программа вылетает - PullRequest
       20

С ++ программа вылетает

2 голосов
/ 19 октября 2010

У меня есть это назначение для реализации функции 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 ]

10 голосов
/ 19 октября 2010

Сбой, если оба входа идентичны, потому что ваш цикл продолжается после завершающего символа 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;
3 голосов
/ 19 октября 2010
while (*s1==*s2)
{
 s1++;
 s2++;
}

'\ 0' == '\ 0'

3 голосов
/ 19 октября 2010

Ваш mystrcmp будет успешно запущен с конца строки, потому что ваш тест для терминатора NUL находится вне цикла.Если строки одинаковы, то и *s1, и *s2 равны 0, и цикл продолжает идти.

1 голос
/ 19 октября 2010

Вам нужно подумать, что произойдет, если ваши две строки выглядят следующим образом:

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

Это остановится, когда вы достигнете конца первой строки или обнаружите разницу ( включая , если вы достигли конца второй строки перед первой).

...