【发布时间】:2013-10-27 22:30:19
【问题描述】:
这段代码我已经写好了
#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 之前打印出任何消息,这使我得出结论,在命令行部分发生了一些事情东西/打开文件。
【问题讨论】:
-
你应该经常检查 fopen() 的返回值是否为 0。
-
@CharlieBurns 你认为打开文件时可能发生了一些事情......这是第一次。但会的。
-
关于
if(strcmp(string,list[i])==0){return 1;};,删除最后一个;(不确定它会影响什么,只是一个混淆因素。 -
@ryyker 不好的做法?
-
您可能想让
print_d打印一个换行符,也可能转到stderr 而不是stdout。似乎标准输出的默认缓冲让您感到困惑。