C - strtol()/atol() 导致分段错误



我的问题是这样的:

#define MAX_LINE_LENGTH 100
#define MAX_RESOURCES_NUM 150
#define MAX_REQUESTS_NUM 150
#define MAX_REPAIRS_NUM 150
struct resource {
long ID;
char* name;
long qty;
sem_t freeResources;
};
struct request {
long licensenum;
long time;
long repcount;
long *repIDarr;
};
struct repair {
long ID;
char* name;
long hours;
long rescount;
long *resIDarr;
};
struct resource* resarr[MAX_RESOURCES_NUM];
struct request* reqarr[MAX_REQUESTS_NUM];
struct repair* reparr[MAX_REPAIRS_NUM];
int timevar, threadcount;
//Func declarations
int main(int argc, char* argv[]){
FILE *resfile, *reqfile, *repfile;
char line[MAX_LINE_LENGTH], *refer;
int i = 0;
timevar = 0;
threadcount=0;
if(argc < 4) { 
printf("Not enough arguments!");
return 0;
}
if((resfile = fopen(argv[1], "r")) == NULL || (repfile = fopen(argv[2], "r")) == NULL || (reqfile = fopen(argv[3], "r")) == NULL){
perror("Open file failed"); 
return 0;
}
//Initialize resources
while(fgets(line, 100, resfile) != NULL){
char* token;
refer = line;
token = strsep(&refer, "t");
long ID = atoi(token);
char* name = strsep(&refer, "t");
token = strsep(&refer, "t");
if(token = NULL){
printf("Xn");
return 0;
}
long qty = atol(token);
}
fclose(resfile);
fclose(reqfile);
fclose(repfile);
return 0;
}

这只是代码的一部分,足以重现问题。

我有一个名为 resources.txt 的 txt 文件:

13  car lift    8
17  front alignment 2
03  headlights adjust   2
10  oil drain   4
23  computerized check  2
35  pneumatic drive 4
40  ceiling winch   2
99  John Smith  1
29  air compressor  1
66  flats tub   1
88  paint gun   1

我用TAB将任何带有strsep()的行分开.

问题是我在运行程序后立即出现分段错误。

当我删除此行时:

long qty = atol(token);

在主要结束时,我没有收到错误。

我找不到导致它的原因。

最奇怪的是,当我在我的个人电脑上运行该程序时,它运行良好(在 CentOS 上( 但是当我在我的大学计算机(使用相同的 CentOS(中运行它时,它向我显示错误。

有什么想法吗?

if(token = NULL){

不是你所期望的。

将其更改为

if (token == NULL) {

并且不要踏入这种"愚蠢"的;)陷阱再次,您可能想考虑从现在开始使用">尤达条件",即将"常量"放在左侧,如下所示:

if (NULL == token) {

因为如果你会这样做

if (NULL = token) {

编译器会大量抱怨。

而且,顺便说一句,如果您使用单步调试器跟踪代码,很可能会很快注意到此错误。

所以我找出了导致问题的原因。 我发现fgets没有在我想象的时候返回EOF,因为它在EOF之前捕获了"n",所以我最终处理了一个字符串'n',就像它是导致strtol获得NULL指针的真实信息行,从而导致分段错误错误。 修复相对容易; 我不得不防止这种情况循环:

while(fgets(line, 100, resfile) != NULL){
char* token;
refer = line;
token = strsep(&refer, "t");
long ID = atoi(token);
char* name = strsep(&refer, "t");
token = strsep(&refer, "t");
if(token = NULL){
printf("Xn");
return 0;
}
long qty = atol(token);
}

当"line"指向只有""的字符串时进行迭代,所以我在 while 循环中添加了一个条件:

while(fgets(line, 100, resfile( != NULL &&strlen(line(> 1(

现在它完美了。

相关内容

  • 没有找到相关文章

最新更新