【发布时间】:2021-08-23 17:23:10
【问题描述】:
请帮我调试这段代码。它给了我一个错误“字符串下标超出范围”
我不知道为什么。程序需要在字符串中查找子字符串的个数。
代码如下:
#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 ! ";
}
}
【问题讨论】:
-
您是否在调试器中运行过程序?它应该准确地告诉您发生这种情况的位置以及当时的程序状态。
-
"String subscript out of range"的哪一部分您不清楚?这意味着你的一根琴弦越界了。您应该通过调试器运行您的代码,并准确查看您的索引在哪里不是您所期望的。但是,我已经可以告诉你while (s1[n] != ' ') { ... n++; }是通过std::string建立索引的错误方法。而且我可以在您的循环中看到很多可以越界访问的地方。你知道std::string有一个find()搜索子字符串的方法吗? -
看起来您允许
n的长度超过字符串的长度。 -
如果你使用
at而不是[]来索引,你会得到一些超出范围的保护。将s1[n]替换为s1.at(n)并同样替换为其余代码。它仍然会出错,但现在会出现异常。