дряблых на детали из-за домашнюю работу тег
вы хотите проходной стог, я = 0 до I = haystack.length с внутренний цикл, который делает j = 0 до j = длина иглы.
проверьте наличие сена [i + j] = игла [j], если нет, вы можете выйти из внутреннего цикла, это не соответствует. Затем вам нужно разработать способ проверки, если вы зациклились на всех иглах и таким образом нашли совпадение
Вам также необходимо убедиться, что вы не выходите за пределы (подсказка, состояние конца внешнего контура)
EDIT
Кроме того, не забывайте, что вы можете получить доступ к данным как массив
int i = 0;
while(haystack[i] != \0){
// do stuff
i++
}
EDIT 2
Еще одна вещь, которую вам нужно запомнить, это то, что char*
не является строкой, если две переменные типа char*
одинаковы, это означает, что они являются одним и тем же указателем. Проверьте, что две строки стиля C одинаковы, вам нужно проверить каждый символ в последовательности.
Ваш внешний цикл должен пройти через первый символ haystack[0]
и должен остановиться, как только он получит нулевой символ. который будет выглядеть как
int i = 0;
while(haystack[i] != '\0'){
// do stuff
i++;
}
вам также потребуется внутренний цикл, так что для каждого символа «стог» вы сравните, если вы можете работать через иглу и получить матч. Вы должны объявить встречное переменную перед вне цикла, но установить его в ноль перед каждый раз, когда внутренний цикл выполняется, так что теперь мы имеем
int i = 0;
int j;
while(haystack[i] != \0){
j = 0;
while(needle[j] != '\0' && haystack[i + j] != '\0'){
// noticed that we also check that we are not going out of bounds of haystack
// do stuff
j++;
}
i++;
}
точно, мы должны сравнить каждый символ, так что мы можем просто заменить // do stuff
с хорошей проверкой, как if(needle[j] != haystack[i +j]){ // no match yet }
.Теперь вам, вероятно, потребуется добавить несколько дополнительных вещей, чтобы отслеживать происходящее, что-то вроде логического «matchFound», которое объявляется перед внешним циклом и устанавливается как true перед внутренним циклом.
С этим булевым значением предполагается, Таким образом, после внутреннего цикла, но все еще находящегося вне цикла, мы можем добавить чек, например if(mathFound) { return i; }
.
Должно быть ясно, что, когда мы проверяем символ иглы на один из стога сена, нам нужно установить «matchFound» в false, где комментарий // no match yet
был. Я также предложил бы переместить && haystack[i + j] != '\0'
во внутренний цикл и настроить таким образом, чтобы, если нашел нулевой байт для стога сена, он должен установить matchFound в false и выйти из внутреннего цикла.
Таким образом, из финалом код будет что-то вроде
int i = 0;
int j;
bool matchFound;
while(haystack[i] != \0){
j = 0;
matchFound = true;
while(needle[j] != '\0'){
if(haystack[i + j] == '\0' || needle[j] != haystack[i+j]){
// combined the out of bound check with the comparison
// note the out of bound check is first, try to think why
matchFound = false;
break;
}
j++;
}
if(matchfound){
return i;
}
// Check first THEN increment i, what happens if we increment i first?
i++;
}
Это, вероятно, все еще нуждается в некоторые настройки, чтобы получить его работу, но вы должны получить много ближе к решению вас проблемы
Я подозреваю «It не работает "- это не сообщение об ошибке, которое вы получили. –
жаль, что это были ошибки кучи – Thatdude1
Я не знаю, хотите ли вы посмотреть на нее, но вы можете улучшить сложность функции google для алгоритма KMP. Я бы также посмотрел на то, чтобы называть ваши параметры немного лучше для 'instring', чтобы было ясно, что такое игла, и что такое стог сена. 'a' и' b' не делают этого. – Matt