C ++:将文件中的数据存储到数组中时编译器特定的分段错误

时间:2016-10-30 06:56:04

标签: c++ arrays c++11 segmentation-fault g++

我正在编写一个C ++程序,它从这个格式的文件(" input10")中获取数字:

1    0    12
2    3    24
3    8    9
4    9    2
5    10   3
6    11   4
7    14   8
8    16   10
9    16   3
10   17   12

每个数字都进入一个数组p_data[3](每行三个数字)。

在Visual Studio中运行时,没有错误,并且正确的数据存储在数组中。我在此处添加了#define _CRT_SECURE_NO_WARNINGS,以便我可以使用strncpy。我不确定strncpy是否是问题的根源。

在CentOS终端上运行g++ -std=c++11时,收到以下错误消息:

  

分段错误(核心转储)

我发现这个问题很难调试。有什么想法吗?

#include <iostream>
#include <cstring>
#include <string>
#include <stdlib.h>
#include <fstream>
using namespace std;

void get_processes() {
    string curr_line;
    ifstream infile("input10");
    int p_data[3];
    int p = 0;
    char line[1024];

    while (getline(infile, curr_line)) {
        strncpy(line, curr_line.c_str(), sizeof(line));
        line[sizeof(curr_line) - 1] = 0;

        int p_data_count = 0;
        for (int i = 0; line[i] != '\0'; ++i) {
            if (line[i] != ' ') {
                string num = "";
                while (line[i] != ' ') {
                    num += line[i];
                    ++i;
                }

                if (p_data_count < 3) {
                    p_data[p_data_count] = stoi(num);
                    ++p_data_count;
                }
            }
        }
    }

    infile.close();
}

int main() {
    get_processes();

    return 0;
}

1 个答案:

答案 0 :(得分:0)

使用C ++ 11,我们可以按如下方式解析字符串对象:

void get_processes() {
    string curr_line;
    ifstream infile("input10");
    int p_data[3];
    int p = 0;

    while (getline(infile, curr_line)) {
        int p_data_count = 0;

        for (int i = 0; i < curr_line.size(); ++i) {
            if (curr_line[i] != ' ') {
                string num = "";
                while (curr_line[i] != ' ' && curr_line[i] != '\0') {
                    num += curr_line[i];
                    ++i;
                }

                if (p_data_count < 3) {
                    p_data[p_data_count] = stoi(num);
                    ++p_data_count;
                }
            }
        }
    }

    infile.close();

}

任何C ++ 11编译器都会识别stoi()方法,并且发生分段错误的可能性要小得多。