当将数据从文件存储到数组时,编译器特定的分段错误

C++: Compiler-specific segmentation fault when storing data from file into array

本文关键字:编译器 错误 分段 数组 数据 文件 存储      更新时间:2023-10-16

我正在编写一个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运行时,我得到以下错误消息:

段故障(core dump)

我发现这个问题很难调试。任何想法吗?

#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] != ''; ++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;
}

在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] != '') {
                    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()方法,并且发生分段错误的机会要小得多。