错误:控制可能达到非无效功能的末尾-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; 
    }