【问题标题】:C++ code Runtime error on 2D array declaration二维数组声明上的 C++ 代码运行时错误
【发布时间】:2021-01-26 15:38:08
【问题描述】:

我不明白为什么这段代码会在输入任何测试用例时出现运行时错误(字符串的大小为 n,然后输入字符串)。甚至连单词“CHECK”(在solve()函数中)都没有被打印出来。请帮忙!

问题链接是:problem

#include <bits/stdc++.h>

using namespace std;


int a[1000][26];
int mov(int l, int u, int x)
{
    if(l==u)
    {
        if(a[l][x]-a[l-1][x]==1)
            return 1;
        else
            return 0;
    }
    int m=(l+u)/2;
    return max(mov(l,m,x+1)+a[u][x]-a[m][x],mov(m,u,x+1)+a[m][x]-a[l-1][x]);
}
void solve()
{
    int i,k,j,n;
    string str;
    cin >> n >> str;
    cout << "CHECK";// This is not getting printed
    for(i=0;i<26;i++)
        a[0][i]=0;
    for(i=1;i<n+1;i++)
    {
        for(j=0;j<26;j++)
        {
            a[i][j]=a[i-1][j];
            if(str[i-1]==j+'a')
                a[i][j]++;
        }
    }
    k=mov(1,n,0);
    cout << n-k << "\n";
}

int main()
{
    int t=1;
    cin >> t;
    while(t--)
        solve();
}

【问题讨论】:

  • 为什么要在 main() 中为单个函数调用使用 while 循环?只需致电solve()
  • 对您正在尝试完成的任务的问题描述,而不仅仅是您认为的问题也很好。 How to Ask
  • l 永远不会等于u 时会发生什么?它将无限期地递归运行。
  • 问题链接为:link
  • 编辑问题,并将问题文本放入其中。否则这将被关闭。

标签: c++ arrays runtime-error


【解决方案1】:

您的第一个输入显示将给出多少输入“对”。在您的情况下,您已跳过这部分并开始收集输入“对”。这就是为什么“CHECK”不会被打印的原因。要解决此问题,请使用 cin 捕获输入对的数量,然后遍历输入以获取该对。

void solve()
{
    int i, k, j, n;
    string str;
    memset(a[0], 0, sizeof(int) * 26); // Use this instead.

    cin >> n;
    cout << "CHECK";     
    for (i = 1; i < n + 1; i++)
    {
        cin >> j >> str;

        for (j = 0; j < 26; j++)
        {
            a[i][j] = a[i - 1][j];
            if (str[i - 1] == j + 'a')
                a[i][j]++;
        }
    }
    k = mov(1, n, 0);
    cout << k << "\n";
}

另外,尽量不要使用using namespace std;

【讨论】:

  • 我觉得如果你要走提供额外建议的路线,你不能停在using namespace std;。单个变量名、主函数循环和全局数组。
  • 我已经更新了我的代码并重新插入了该数量的测试用例部分(我故意将其删除,以免打扰人们)...问题仍然存在
猜你喜欢
  • 2019-09-25
  • 1970-01-01
  • 1970-01-01
  • 2019-12-11
  • 1970-01-01
  • 1970-01-01
  • 2016-12-09
  • 2014-01-14
  • 1970-01-01
相关资源
最近更新 更多