遍历字符串的代码的字符串下标超出范围错误c ++

String subscript out of range error for code that traverses string c++

我正在尝试计算 space 分隔整数字符串中正数、负数和零的数量。输入字符串中的整数个数由用户指定。

代码编译正常,但是每次我尝试 运行 它时,它都会崩溃并出现错误“调试断言失败。...表达式:字符串下标超出范围”。

#include <iostream>
#include <string>
#include <iomanip>

int main() {
    int i = 0;
    int n, x;
    int positives = 0;
    int negatives = 0;
    int zeros = 0;
    std::string ip;
    char space = ' ';
    std::cin >> n;
    std::cin >> ip;
    while (i < n) {
        if (ip[i] != space) {
            x = (ip[i]);
            if (x > 0) {
                positives++;
            }
            else if (x < 0) {
                negatives++;
            }
            else if (x == 0) {
                zeros++;
            }
        }
        i++;
    }
}

首先 std::cin >> some_string_var 将在它找到的第一个白色 space 字符处 停止,因此使用它来搜索没有什么意义spaces 分隔单词。

你最好只读入 整数 并将它们直接与零进行比较。以下是如何在代码中使用 MNC(最少的必要更改):

#include <iostream>

int main() {
    int i = 0;
    int n;
    int positives = 0;
    int negatives = 0;
    int zeros = 0;
    int value;
    std::cin >> n;
    while (i < n) {
        std::cin >> value;

        if (value > 0)
            positives++;
        else if (value < 0)
            negatives++;
        else
            zeros++;

        i++;
    }
    std::cout << "p=" << positives << ", n=" << negatives << ", z=" << zeros << '\n';
}

下面是示例 运行,请记住初始 4 是一个计数而不是其中一个值:

pax:~> ./prog
4
0 1 2 -99
p=2, n=1, z=1

如果您正在寻找更强大的东西,您可以使用这样的东西:

#include <iostream>

int main() {
    int quant, pos = 0, neg = 0, zer = 0, value;
    std::cout << "How many input values? ";
    if (! (std::cin >> quant )) {
        std::cout << "\n*** Invalid input.\n";
        return 1;
    }
    if (quant < 0) {
        std::cout << "\n*** Negative quantity input.\n";
        return 1;
    }

    for (int count = 1; count <= quant; ++count) {
        std::cout << "Enter value #" << count << ": ";
        if (! (std::cin >> value )) {
            std::cout << "\n*** Invalid input.\n";
            return 1;
        }

        if (value > 0.0)
            pos++;
        else if (value < 0.0)
            neg++;
        else
            zer++;
    }

    std::cout << "Positive value count: " << pos << '\n';
    std::cout << "Negative value count: " << neg << '\n';
    std::cout << "Zero value count:     " << zer << '\n';
}

它在与用户的交流方面更加友好(无论是请求的内容还是生成的结果)。它在检测不良输入方面也更加稳健。