错误:控制可能达到非无效功能的末尾-cat功能
终端:错误:控制可能达到非无效功能的末尾-cat功能,c,C,终端: char *wcat(char *str, size_t n, FILE *fp){ if (fp == NULL) { printf("wcat cannot open file\n"); fclose(fp); perror("File cannot be opened"); return NULL; exit(1); }else{ if ((str = fgets(s
char *wcat(char *str, size_t n, FILE *fp){
if (fp == NULL) {
printf("wcat cannot open file\n");
fclose(fp);
perror("File cannot be opened");
return NULL;
exit(1);
}else{
if ((str = fgets(str,n,fp)) != NULL){
printf("%s",str);
return str;
exit(0);
}
}
}
fp已经等于fopen(…)
我不知道为什么会这样。我想创建此wcat文件,使其工作方式如下:
gcc -o wcat wcat.c
Error: wcat.c:36:1: warning: control may reach end of non-void function [-Wreturn-type]
else子句还需要一个
else
,或者至少需要一个默认返回。您的if
s没有涵盖所有可能的情况。警告正好说明了问题所在
./wcat file1.c file2.c
对exit
的调用都没有意义。他们永远不会被处决。看起来您正试图使用它们返回某种成功/失败标志,但是:
返回
退出
终止程序返回
这个有很多问题。我建议您在调试器中单步执行。以下更改和注释是处理此函数的正确方法:
char *wcat(char *str, size_t n, FILE *fp){
if (fp == NULL) {
printf("wcat cannot open file\n");
fclose(fp);
perror("File cannot be opened");
return NULL;
//exit(1);
}
else if (fgets(str,n,fp))
{
printf("%s",str);
return str;
// exit(0);
}
return NULL; /// or whatever it is that you expect to happen here.
}
处理第二条if语句的else情况。
else
中的if
语句可能不会执行if
的主体,这会让函数返回,但不会返回任何值。注意返回str;出口(0)代码>是愚蠢的;退出(0)代码>将不会执行。与类似,返回NULL;出口(1)代码>。调用退出(0)是什么意思代码>右后返回str代码>?你不可能到达那个出口
。wcat()
做什么?它是否将第一个文件的内容打印到标准输出,然后再打印第二个文件的内容?如果是这样,您需要在else
子句中使用一个循环来重复读取并打印行。如果您将文件*
作为参数,则函数一致性的另一个注意事项是,它应该在调用者中打开并验证。(我可以看到一些不适用的临时函数调用,但通常…)类似地,如果您没有在函数中调用fopen
,那么fclose
可能也会由调用方处理。将一个操作的不同部分分散到不同的无关函数中会导致灾难。保持处理事件的逻辑方法——这使它们更容易跟踪。如果(fp==NULL)
,则无需使用fclose(fp)
,只返回NULL
,也不需要str=
部件。您只需if(fgets(str,n,fp))printf(“%s”,str);返回str代码>同时,注意, NulLPTR < /C>是C++概念——它还不是C的一部分(但它可能是C2X的一部分)。@ JonathanLeffler好调用——我没有读过标签。考虑删除这个。代码有很多错误。很难有条理地批评那些一开始就不连贯的东西。尽管如此,你还是提出了一些好的观点,如果你愿意,你还可以采取一些行动。我不认为有必要删除你的答案。没有必要用核武器,只要不断改进就行了。
char *wcat(char *str, size_t n, FILE *fp){
// note: this check should have been handled
// where/when 'fopen()' was called
if (fp == NULL) {
// this changes the value in 'errno'
// so 'perror() will not display the right message
//printf("wcat cannot open file\n");
//fclose(fp); // <-- never open'd so cannot close
perror("File cannot be opened");
return NULL;
//exit(1); // <-- will never be executed
}else{
if (fgets(str,n,fp)){
printf("%s",str);
return str;
//exit(0); // <-- will never be executed
}
return NULL; // <-- need to handle when 'fgets()' fails
}
}
char *wcat(char *str, size_t n, FILE *fp)
{
if ( fgets( str, n, fp ) )
{
printf("%s",str);
return str;
}
return NULL;
}