我的问题是这样的:
#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(
现在它完美了。