首页 > 解决方案 > 问题:“字符串下标超出范围”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 ! ";
    }
}

标签: c++string

解决方案


您没有正确循环字符串,因此最终超出范围,导致未定义的行为。您不应该使用字符值来知道何时到达字符串的末尾,而是使用索引。

尝试更多类似的东西:

#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)!";
    }
}

在线演示


推荐阅读