【发布时间】:2018-07-20 08:34:17
【问题描述】:
此代码用于解析 csv 文件,但会导致分段错误。 我可以在这里看到类似的代码:Nested strtok function problem in C
它们看起来相同,但我的代码导致分段错误。为什么?
#include <cstdlib>
#include <string.h>
#include <stdio.h>
#include <vector>
using namespace std;
struct inputTuple{
int user, item, rating;
};
int main(void)
{
char xdata[] = "1,88,0,874965758;1,2,1,876893171;1,99,1,878542960;";
vector<inputTuple> input;
int maxUser = 0, maxItem = 0;
int user, item, rating;
char *end_str;
char *data_point = strtok_r(xdata, ";", &end_str);
while(data_point != NULL) {
char *end_attr;
char *data_point_attr = strtok_r(data_point, ",", &end_attr);
while(data_point_attr != NULL) {
user = atoi(data_point_attr);
data_point_attr = strtok_r(NULL, ",", &end_attr);
item = atoi(data_point_attr);
data_point_attr = strtok_r(NULL, ",", &end_attr);
rating = atoi(data_point_attr);
strtok_r(NULL, ",", &end_attr);
input.push_back({user, item, rating});
maxUser = max(maxUser, user);
maxItem = max(maxItem, item);
}
data_point = strtok_r(NULL, ";", &end_str);
}
return 0;
}
【问题讨论】:
-
不要在 c++ 中使用
strtok()。也不一定是strtok()的错。 -
你试过调试吗?
-
我有使用它的限制。在英特尔 SGX 飞地下。
-
如果一行没有所有字段
data_point_attr = strtok_r(NULL, ",", &end_attr);返回NULL和atoi触发段错误,可能是最后一个token的情况 -
不,即使我删除也不行;从最后。 coliru.stacked-crooked.com/a/dee251b2308b7cb9