【问题标题】:C++ An invalid parameter was passed to a function that considers invalid parameters fatalC++ 一个无效参数被传递给一个认为无效参数致命的函数
【发布时间】:2022-01-23 06:21:28
【问题描述】:

所以,我正在尝试编写一个程序,该程序最终将创建一个二维数组,该数组将包含用户输入字符串中数学运算符的位置。因此,例如,如果用户输入 2+5-3,我希望我的数组类似于 {{+,1}{-,3}}。我打算只使用一个整数数组和一个已知的从 +,-,/,*,^ 到 1,2,3,4,5 的翻译。但是,当我尝试测试它说“字符串下标超出范围”时,我不断抛出一个异常,然后我的 IDE 在我的 if 语句上放置一个错误代码,内容为“一个无效参数已传递给一个认为无效参数致命的函数”。有什么想法我搞砸了?

#include <iostream>
#include <string>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <climits>

using namespace std;


int main()
{
equationstart:
    string eq;
    int posOp[50][2];
    int i;
    int i2 = 0;
    int i3;

    getline(cin, eq);
    for (i = 0; i <= 49; i++) {
        if (eq[i] == '+') {
            posOp[i2][0] = 1;
            posOp[i2][1] = i;
            i2++;
        }
    }

    for (i = 0; i <= 49; i++) {
        for (i3 = 0; i3 <= 1; i3++) {
            cout << posOp[i][i3];
        }
        cout << endl;
    }

    cout << endl;
    goto equationstart;

}

现在我要做的就是填充数组,然后将获取的数组显示到屏幕上,这样我就可以看到它正在工作。

【问题讨论】:

  • 您输入的行中可能没有输入 50 个字符。您假设 eq 至少有 50 个字符:if (eq[i] == '+') {
  • 不推荐 goto,改用 while 循环,用 goto 打破重度嵌套循环,一般避免 goto
  • 已经修复了,谢谢,不好意思
  • 在最后的函数中,它是对不同函数的调用,我只是将 goto 用于测试目的,所以程序会自动重复整个程序
  • 如果用户输入 2+5-3,我希望我的数组类似于 {{+,1}{-,3}}。 我没有看到对数组执行此操作的代码。该数组也是一个整数数组。

标签: c++


【解决方案1】:

a) 请不要使用 C 数组 posOp[50][2]。改用 std::vector 。如果您使用 posOp.at(idx),它会进行范围检查。 std::vector 是 C++ 最基本和最重要的特性之一。

b) 正如@drescherjm 在上面的 cmets 中指出的那样,当 eq.size() 小于 50 时,eq[i] 将触发异常(幸运的是)。您的循环从 0 运行到 49,这对于 @ 来说很好987654323@,但 eq 可能更短。您正在访问 eq 超出范围。

【讨论】:

  • 是的,把它改成``` strlen = eq.length(); if (strlen >= 49) { cout
  • 很高兴听到您修复了它。顺便说一句,考虑避免长度假设和固定长度向量。您假设 50 对所有情况都足够长。这些假设是困扰 IT 世界的安全问题的主要原因之一。恶意软件编写者将搜索诸如此类的假设并加以利用。使用 std::vector 和 std 中的所有其他好的容器并编写代码,以便它可以使用任何长度或以最低限度检查代码中的 every 假设并打印错误(如果错误) .
  • 如果字符串长度超过 50,我确实会写错,所以即使字符串完全由运算符组成,它也不会超出 posOp 矩阵。我会研究向量,我真的只是开始作为一种爱好来学习。这个程序离开我的电脑的可能性为 0 大声笑
猜你喜欢
  • 1970-01-01
  • 2015-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多