我正在编写一个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;
}
答案 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()
方法,并且发生分段错误的可能性要小得多。