我已经写了这段代码
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
char *list[20],*story[100];
FILE*listfile;
FILE*infile;
FILE*outfile;
int check(char*string)
{
int i=0;
while(list[i]!=NULL)
{
if(strcmp(string,list[i])==0){return 1;};
i++;
};
return 0;
};
void print_d(int d){ printf(" debug %d ",d);};
int main(int argc,char**argv){
assert(argc==4);
printf("hello \n");
//assigning the file pointers in their respective modes
printf("%s %s %s ",argv[1],argv[2],argv[3]);
listfile=fopen(argv[1],"r");
print_d(12);
infile=fopen(argv[2],"r");
outfile=fopen(argv[3],"w");
print_d(0);
int i=0; /* the infamous 'i' */
while(1)
{
if(feof(listfile)!=0)
{ break;};
list[i]=malloc(sizeof(char [15]));
fscanf(listfile,"%s[^\n]",list[i]);
i++;
}
i=0;
print_d(1);
while(1)
{
if(feof(infile)!=0)
{ break;};
story[i]=malloc(sizeof(char [25]));
fscanf(infile,"%s",story[i]);
i++;
}
fclose(infile);
fclose(listfile);
i=0;
print_d(2);
while(1)
{
if(check(story[i])==1)
{ fprintf(outfile,"%s","censored");}
else
{
fprintf(outfile,"%s",story[i]);
};
};
print_d(3);
fclose(outfile);
i=0;
while(list[i]!=NULL)
{ free(list[i]);};
return 0;
}
会出现以下问题
[1] 输出是一个 hello 后跟一个 seg 错误
这就是事情变得有趣的地方
如果我修改
printf("%s %s %s ",argv[1],argv[2],argv[3]);
至
printf("%s %s %s\n ",argv[1],argv[2],argv[3]);
输出是一个“你好”,后跟三个文件名,然后是一个段错误。
在用户 danfuzz 指出我应该将 print_d 调试更改为打印到 stderr 之后(我做了)..调试打印现在工作正常。所以我想一个更好的问题是为什么首先会发生这种情况以及防止这种情况发生的步骤事情从发生?
对于经验丰富的程序员来说,这似乎是一个微不足道的问题,但请注意,早期版本(上面代码中的那个)未能在 seg fault 之前打印出任何消息,这让我得出结论,事情的命令行部分发生了一些事情/打开的文件。