2015-05-25 2 views
-5

Я практикуя свой «код гольф» или программирования интервью, как вопросы и не могу понять, почему я получаю ошибку сегментации в следующем:В чем причина ошибки сегментации в этой программе?

#include <iostream> 

bool contained (char * str1, char * str2) 
{ 
// returns true or false depending on whether the string str1 is contained in str2 
    while (str2) 
    { 
     if (*str1 == *str2) 
     { 
      char * temp = str2; 
      while (*str1++ == *temp++); 
      if (!*str1) return true; 
     } 
     else 
     { 
      ++str2; 
     } 
    } 
    return false; 
} 

int main() 
{ 
    char sa [] = "abc"; 
    char sb [] = "rehabc132"; 
    std::cout << contained(sa, sb); // should print out 1 
    return 0; 
} 

Доказательство: http://codepad.org/5Ff3qTIX

Любой идеи почему?

+1

Поскольку вторая строка длиннее, вы проходите мимо конца первой строки ... –

+4

Также вы, вероятно, имели в виду 'while (* str2)'? –

+0

'* str1 ++' вложен в два цикла, поэтому в конечном итоге вы завершите работу с этой строкой. –

ответ

0

Ошибка 1: Внешняя петля должна быть while (*str2) otherwhise вы выйдете из диапазона и рискуете segfault.

Ошибка 2: Внутренний контур не должен проверить, что ни один из строки reacehs конец: while (*str1 && *temp && *str1++ == *temp++);

Ошибка 3: во внутреннем цикле, вы теряете начало строки, которую вы ищете (str1). Поэтому вы должны использовать другой временный указатель. Я оставлю эту часть в качестве упражнения для вас.

Смежные вопросы