Поиск, содержится ли строка в другой строке без «find» в c

#c #string

#c #строка

Вопрос:

Я написал эту программу, чтобы найти, содержится ли строка в другой строке (см. параграф ниже, Я попытался объяснить, что я хочу, чтобы она делала). Когда я это тестирую, иногда это работает, в большинстве случаев это выдает мне ошибку «Строковый индекс вне диапазона». Я очень новичок в C , я был бы признателен, если бы кто-нибудь сказал мне, как я могу улучшить этот код или почему я тупой, потому что я действительно не понимаю, почему это не работает.

что я хочу сделать, так это найти, можно ли найти строку один строковым способом; поэтому я хочу, чтобы он проверял каждую букву строкового способа, если буква [i] равна первой букве строки один (путь [i 0]==один [0]), и путь [i 1]==один [1] и так далее для всех букв в одном.

так, например, way = abankjve и one = ank, он принимает первую букву в way (a) и получает первую букву в one (a). они равны. но мы видим, что таким образом [0 1] не равно единице [1]. таким образом, o не может быть true. так продолжается до тех пор, пока не дойдет до way[2]=a. way[2 0]=one[0]. значение o равно true. затем он проверяет путь [2 1]=один[1]. верно! затем он проверяет путь [2 2]=один[2]. верно! тогда она содержится в way.

 #include <iostream>
using namespace std;

int main()
{
    string way, one;
    bool o=false;
    cin >> way;
    cin >> one;

    for (int i = 0; i < way.size(); i  )
    {
        for (int k = 0; k < one.size(); k  )
        {
            if (way[i   k]==one[k])
            {
                o = true;
             
            }
            
        }
    }
    cout << o << endl;

}
  

Комментарии:

1. Обычно вы делаете это наоборот. Т. Е. на каждой итерации внешнего цикла вы ожидаете совпадения ( set o = true ) и прерываете внутренний цикл на первом несоответствующем символе. Кроме того, ваш код будет выдавать ошибки во время выполнения, потому что вы не проверяете границы. Что, если i k > way.size() ?

2. Совет, если он компилируется, объясните программу резиновой утке (или брату или сестре, которых вы хотели бы раздражать: P)

Ответ №1:

Если вы подумаете об этом, way[i k] это приведет к тому, что индекс выйдет за пределы диапазона. скажем, way это длина 5 и one это длина 3.
i k Диапазон 0 <= i k <= 6 . Значение Witch больше возможного индекса way .

измените первый цикл for for (int i = 0; i < way.size(); i ) на
for (int i = 0; i <= (int)way.size() - one.size(); i )

Обратите внимание, что я использовал static_cast для int . *.size() возвращает unsigned int so, если one размер s больше way размера s, результат будет не таким, как вы себе представляли.

Комментарии:

1. «Не я использовал static_cast для …» Нет, вы использовали приведение в стиле C (даже если эффект здесь тот же).

Ответ №2:

 #include <iostream>
#include <string>

int main()
{
    std::string way, one;
    std::cin >> way;
    std::cin >> one;
    bool found{};

    for (size_t i = 0; i < way.size() - one.size() 1; i  )
    {
        if(one == way.substr(i, one.size())) {
            found = true;
            break;
        }
    }
    std::cout << found;

}

  

ДЕМОНСТРАЦИЯ