c++ - 问题:“字符串下标超出范围”C++
问题描述
请帮我调试这段代码。它给了我一个错误“字符串下标超出范围”
我不知道为什么。程序需要在字符串中查找子字符串的数量。
这是代码:
#include <iostream>
#include <string>
using namespace std;
int main() {
string s1;
string s2;
int count = 0;
int m = 0;
int n = 0;
cout << "String : ";
getline(cin, s1);
cout << "Substring : ";
getline(cin, s2);
int len = s2.length();
while (s1[n] != ' ') {
if (s1[n] == s2[m]) {
while (s1[n] == s2[m] && s1[n] != '\0') {
n++;
m++;
}
if (m == len && (s1[n] == ' ' || s1[n] == '\0' )) {
count++;
}
}
else {
while (s1[n] != ' ') {
n++;
if (s1[n] != '\0') {
break;
}
}
}
n++;
m = 0;
}
if (count == 0) {
cout << "String contains no subtring ! ";
}
else if (count > 0) {
cout << "String contains " << count << " substring ! ";
}
}
解决方案
您没有正确循环字符串,因此最终超出范围,导致未定义的行为。您不应该使用字符值来知道何时到达字符串的末尾,而是使用索引。
尝试更多类似的东西:
#include <iostream>
#include <string>
using namespace std;
int main() {
string s1, s2;
do {
cout << "String : ";
getline(cin, s1);
}
while (s1.empty());
do {
cout << "Substring : ";
getline(cin, s2);
}
while (s2.empty());
string::size_type s1_size = s1.size(),
s2_size = s2.size(),
m = 0,
n = 0,
k;
int count = 0;
while (n < s1_size) {
if (s1[n] == s2[m]) {
k = n;
do {
++n;
++m;
}
while (n < s1_size && m < s2_size && s1[n] == s2[m]);
if (m == s2_size) {
++count;
}
else {
n = k + 1;
}
m = 0;
}
else {
++n;
}
}
if (count == 0) {
cout << "String contains no substring!";
}
else {
cout << "String contains substring " << count << " time(s)!";
}
}
如果您使用它可以大大简化std::string::find()
,例如:
#include <iostream>
#include <string>
using namespace std;
int main() {
string s1, s2;
cout << "String : ";
getline(cin, s1);
cout << "Substring : ";
getline(cin, s2);
string::size_type pos = 0;
int count = 0;
while ((pos = s1.find(s2, pos)) != string::npos) {
++count;
pos += s2.size();
}
if (count == 0) {
cout << "String contains no substring!";
}
else {
cout << "String contains substring " << count << " time(s)!";
}
}
推荐阅读
- java - Spring Cloud Contract 与 Spring Cucumber
- neo4j - 不是创建适当的索引查询而是花费大量时间但是 neo4 写入速度足够快
- c++ - 带有 Visual C++ 的 libclang
- python - 嵌套循环,二维数组
- php - 数据表 - 通过引导日期选择器值过滤 sql 查询
- postgresql - 如何连接到 Google CloudSQL PostgresSQL
- amazon-web-services - 在 cloudformation 中限制对 VPC 的 API Gateway 端点的访问
- java - 无法在spring框架中将freemarker模板的编码更改为UTF-8
- postgresql - AWS RDS PostgreSQL 中不存在 pg_catalog
- java - 云你帮我描述一下递归程序的思维如何?(一步步)