#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;
}