我目前有一个用于存储端口和目标地址信息的结构,我想用一个简单的文本文件读取数据。
typedef struct {
int listen_port;
int forward_port;
char *forward_addr;
} Route;
如果我只指定30就可以了。
E.G。
while((read = getline(&line, &length, f)) != -1) {
Route *srv = (Route*) malloc(sizeof(Route));
srv->listen_port = 30; //works fine
/* rest of code */
}
但是,如果我尝试使用strtok
来标记从文件80,127.0.0.1,8080
读取的行,然后将其分配给srv->listen_port
,则会出现seg错误。
E.G。
while((read = getline(&line, &length, f)) != -1) {
int port = atoi(strtok(line, ","));
Route *srv = (Route*) malloc(sizeof(Route));
srv->listen_port = port; //seg fault
/* unreachable code */
}
有人可以解释为什么会这样吗?我很难过为什么它不起作用。
提前致谢。
答案 0 :(得分:3)
见
atoi — how to identify the difference between zero and error?
此外,如果line是一个零长度的字符串,strtok只能返回NULL,所以可能有atoi(NULL)
此代码的行为可能未定义......
1)将行初始化为NULL,getline会为你分配空间(如果它不是NULL,它会假设你已经分配了它)
2)使用后自由行
3)使用strtol或scanf来获取整数,因为你和编译器不能确定输入行是否包含ascii数字中的数字
4)检查malloc的返回值,如果失败则返回NULL
作为一般规则,处理每个可能的错误情况,这是C
中必要的最佳实践