查找一个字符串是否包含在另一个字符串中,而不"find" 在 c++ 中
Finding if a string is contained in another string without "find" in c++
我编写这个程序是为了确定一个字符串是否包含在另一个字符串中(请参阅下面的一段,我试图解释我希望它做什么(。当我测试它时,有时它有效,大多数时候它会给我错误";字符串下标超出范围";。我是C++的新手,我很感激有人告诉我如何改进这段代码,或者为什么我很笨,因为我真的不明白为什么它不起作用。
我想做的是找到字符串一是否可以用字符串的方式找到;所以我希望它检查字符串way的每个字母,如果字母[i]等于字符串one的第一个字母(way[i+0]==one[0](,以及way[i+1]==one[1],依此类推。
例如way=abankjve和one=ank它取方式(a(中的第一个字母,得到其中一个(a(的第一个字符。他们是平等的。但是我们看到[0+1]不等于1[1]。所以o不可能是真的。它一直这样下去,直到它到达方式[2]=a。方式[2+0]=一[0]。o是真的。则它检查路[2+1]=一[1]。真的!则它检查路[2+2]=一[2]。真的!然后其中一个被遏制住了。
#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;
}
仔细想想,way[i+k]
会导致索引超出范围。比如way
是5的长度,one
是3的长度。i+k
的范围是0 <= i + k <= 6
。Witch大于way
的可能指数。
首先将循环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
,所以如果one
的大小大于way
的大小,结果将不是您想象的那样。
#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;
}
演示
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 我如何通过引用将 c++ 字符串分配给另一个字符串
- 使用另一个字符串从字符串中删除空格
- 有没有办法使用 strcpy 将字符串数组复制到另一个字符串或其他数组中?
- 当分配一个字符串值并稍后通过分配另一个值进行更改时C++如何管理内存?
- 如何在不知道对应关系的情况下在字符串中搜索字符并将其分配给另一个字符?
- 如何在使用 getch 后在另一个字符串的末尾连接一个字符串
- 如何在另一个字符串的x位置插入一个字符串?
- 从 C 字符串构造 std::string 与从另一个 std::string 构造 std::string 不一致
- C++:递归地将字符串中一个字母的所有实例替换为另一个字母
- 在另一个字符串中插入文件扩展名之前的字符串
- 使用C++将一个字符串替换为另一个字符串
- 将字符从一个字符串简单分配到另一个字符串不起作用
- 将 int 转换为字符串,然后连接另一个变量以创建完整扩展名,然后将其转换为 const_char*
- 将字符串中的单个单词替换为另一个单词
- 将文本流中一个字符串的所有匹配项替换为另一个字符串
- 无法将字符串用作另一个类的参数
- 另一个字符串文字,UDL 迷宫
- 在给定字符串上使用 tolower() 和 isalpha() 并将其输出设置为另一个字符串
- 如何使用循环从另一个字符串创建一个没有空格的新字符串