Ideone中的运行时错误,但在代码块中工作正常

时间:2014-11-27 18:32:04

标签: c++ codeblocks

我在代码块上测试了这段代码并且它工作正常但是当我在Ideone上运行时,我在OJ上遇到运行时错误和SIGSEGV错误。我在网上看到SIGSEGV错误是由于内存访问受限造成的。但如果它这样做,为什么不会有代码块抱怨......

#include <bits/stdc++.h>
using namespace std;

int main()
{
    ios_base::sync_with_stdio(false);
    int t, i, j, k, x, temp;
    int num1[10000], num2[10000];
    char c;
    bool f = true;
    cin >> t;

    while (t--)
    {
        for (i = 0; i < 10000; i++)
        {
            num1[i] = 0;
            num2[i] = 0;
        }
        i = 0;
        j = 0;
        while (!isspace(c = getchar()))
            num1[i++] = c - '0';
        while (!isspace(c = getchar()))
            num2[j++] = c - '0';
        x = i > j ? i : j;
        temp = 0;
        for (k = 0; k < x; k++)
        {
            i = temp + num1[k] + num2[k];
            if (f)
            {
                if (i % 10 != 0)
                {
                    f = false;
                    cout << i % 10;
                }
            }
            else cout << i % 10;
            temp = i / 10;
        }
        if (temp != 0)
            cout << temp;
        cout << endl;
        f = true;
    }
    return 0;
}

1 个答案:

答案 0 :(得分:5)

此:

while (!isspace(c = getchar()))

将继续前进,直到找到空格字符。如果最终输入值后没有空格,则getchar()将返回EOF,您将char截断为isspace并传递给isspace,给出未定义的行为。有可能t将返回false,并且您将永远循环,离开固定大小数组的末尾,直到您达到无法寻址的内存并导致分段错误。

使用前请务必检查输入。如果没有输入,您也会遇到大问题,因为您不会检查{{1}}是否已被成功阅读。