为什么会出现Segmentation fault错误

时间:2015-08-20 14:17:05

标签: c++ segmentation-fault

我的代码在我的计算机上的代码块编译器上工作正常,但当我将其上传到在线编辑器时,我收到了分段错误错误,我不知道原因。

#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <fstream>
using namespace std;
int main(int argc, char *argv[]) {
    ifstream stream(argv[1]);
    char line[1000];
    int x,last=-1;
    while (stream>>line)
    {
        x = atoi(strtok(line,","));
        cout<<x;
        last=x;
        while(x=atoi(strtok(NULL,",")))
        {
            if(x!=last)
            {
                cout<<","<<x;
                last=x;
            }
        }
        cout<<endl;
    }
    return 0;
}
  

您将获得一个带有重复项的已排序数据列表。打印出已删除重复项的已排序列表。

这是输入

6,7,8,9,9,10,11,12,13,14,15
11,12,13,14,15,16,17,18,19,20
2,2,2,2,2
10,11,12,13,14,15,16,16,17
13,14,14,15,16,17,17,17,18
15,16,17,17,18,18,18,18,19,19,20
2,3,4,5,5
13,14,15,16,17
10,11,12,13,14,15,15,15,15,16,16,16
12,13,14,15,16,17,17,18
5,6,7,8,9,10,11
14,14,14,15,15,16,17,17,18,19,19,20,21,22
13,14,15,16,16,17,17,18
15,16,17,18,19,20,21,21,21,21,22,22
6,6,6,7,8,9,10,11,11,11,12,12,13
12,12,13,14,15,15,16,17,17,18,19,19,20,21
8,9,9,9,10,10,11,12,13,13,14,15
12,13,14,15,16,17,18
1,1,1,2,2,3,3,4,4
1,2,3,4

2 个答案:

答案 0 :(得分:2)

因为你要我们猜测,让我们从顶部开始......

代码不会检查argv[1]是否有效。如果没有,那么您只需取消引用空指针,这会导致您的分段错误。

您的“在线编辑器”是否传递参数?我建议您查看argc > 1

接下来,您的代码看起来会在每行末尾传递一个空指针atoi。这是另一个分段错误。

答案 1 :(得分:1)

您正在调用atoi,结果为strtok。 如果strtok没有找到任何内容,则返回空指针。 这就是最后一行的情况。

因此,您将空指针传递给atoi,然后导致崩溃。

使用您的示例,这应该工作:     #define _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <fstream>


using namespace std;
int main(int argc, char *argv[]) 
{
    ifstream stream(argv[1]);
    char line[1000];
    char* ln;
    char* num;
    int x;
    int last;

    while (stream >> line)
    {
        ln = line;
        last = -1;
        while (num = strtok(ln, ","))
        {
            x = atoi(num);
            if (x != last)
            {
                if(last != -1) cout << "," << x;
                else cout << x;
                last = x;
            }
            ln = NULL;
        }
        cout << endl;
    }
    return 0;
}

编辑:检查有效参数的另一个解决方案,无strtokatoi

#define  _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <fstream>


using namespace std;
int main(int argc, char *argv[]) 
{
    if (argc < 2) {
        cout << "Usage: " << argv[0] << " <file>";
        return 1;
    }

    ifstream stream(argv[1]);
    if (!stream.is_open())
    {
        cout << "Failed to open file \"" << argv[1] << "\"";
        return 2;
    }

    char line[1000];
    while (stream >> line)
    {
        int last = -1;
        int x = 0;
        for (char* pos = line; pos < line + strlen(line); pos++)
        {
            if (*pos >= '0' && *pos <= '9')
            {
                x = (x * 10) + (*pos - '0');
            }
            else
            {
                if (last != x)
                {
                    if (last != -1) {
                        cout << ',';
                    }
                    cout << x;
                    last = x;
                }
                x = 0;
            }
        }
        cout << endl;
    }
    return 0;
}