如何在我的代码中解决 SIGSEGV

How to solve SIGSEGV in my code

本文关键字:解决 SIGSEGV 代码 我的      更新时间:2023-10-16

有人可以帮助我解决问题吗?

写了程序,它给了我分段错误,我不知道我能用它做什么,我尝试了几个小时来解决它,但我不能。

如果有人能帮忙,那就太好了!

这是我的代码:

#include <stdio.h>
#include <vector>
inline int fastScanfInt(FILE *input, int *x);
int main()
{
    std::vector<int> v;
    int t = 0;
    fastScanfInt(stdin, &t);
    int tmp = 0, test = 0;
    test = fastScanfInt(stdin, &tmp);
    while(test != EOF)
    {
        v.push_back(tmp);
        test = fastScanfInt(stdin, &tmp);
    }
    std::vector<int>::iterator it;
    int pos = 0, c, v_size = 0;
    for(int i = 0; i < t; i++)
    {
        if(v[pos] % 2 == 0)
        {
            c = v[pos + 1];
            it = v.begin();
            std::advance(it, pos + 1);
            v.erase(it);
            v_size = v.size();
            pos += c % v_size;
            if(pos > (v_size - 1))
                pos -= v_size;
        }
        else
        {
            c = v[pos];
            it = v.begin();
            std::advance(it, pos + 1);
            v.insert(it, (c - 1));
            v_size = v.size();
            pos += c % v_size;
            if(pos > (v_size - 1))
                pos -= v_size;
        }
    }

    for(int i = pos; i < v.size(); i++)
    {
        printf("%d ", v[i]);
    }
    for(int i = 0; i < pos; i++)
    {
        printf("%d ", v[i]);
    }
}
inline int fastScanfInt(FILE *input, int *x)
{
    register char c = getc(input);
    if(c != EOF)
    {
        (*x) = 0;
        for( ; ((c < 48) || (c > 57)); c = getc(input));
        for( ; ((c > 47) && (c < 58)); c = getc(input))
            (*x) = ((*x) << 1) + ((*x) << 3) + c - 48;
    }
    return c;
}

在索引v时,应始终确保边界中的 i pos。给它奇数个输入将导致if(v[pos] % 2 == 0)行失败,因为 pos 会走得太远。

同样,std::advance(it, pos + 1);可以带你出界。给它偶数个输入就可以做到这一点。

给它三个数字可以在没有段错误的情况下工作,因为第二个数字被存储,但第三个数字不是。我相信while(test != EOF)无法将最终数字存储在向量中。

我实际上还没有自己修复代码,但是通过查看它崩溃的位置,我很确定如果您可以修复这些错误,您将处于更好的位置。