如何删除警告:控制到达非空函数的结尾?

时间:2017-03-31 12:59:03

标签: c gcc

我知道这是由于函数结束时没有返回引起的,但如果我只希望它在特定条件下返回,那该怎么办呢?我试图在函数中传递返回值,但它返回它看到的第一个我不想发生的暗淡。

char dimension(void)
{
    char dim,d;
    printf("2D or 3D?\n");
    dim=getchar();
    if(dim=='2'||dim=='3')
    {
        d=getchar();
        if(d=='\n')
        {
            printf("You selected %cD\n",dim);
            return dim;
        }
        else
        {
            for(;d!='\n';d=getchar());
            if(d=='\n')
            dimension();
        }
    }
    else
    {
        for(;d!='\n';d=getchar());
        if(d=='\n')
        dimension();
    }   
//return dim; --> undesired return value.

}

1 个答案:

答案 0 :(得分:0)

你的程序似乎比它需要的更复杂,问题似乎集中在处理尾随换行符。

最好编写专用于清除输入流的函数。另请注意,getchar()会在出现错误时返回EOF,或者如果用户从键盘发出EOF信号,或者可能是从文件重定向输入。下面的clear_stdin()函数会检查\nEOF,以避免在这种情况下出现无限循环。

正如@IanAbbott所指出的那样,dim应该是int,因为getchar()的返回类型是int,而char }可能不会保留EOF的值。如果getchar()中存在错误,则会输入无限递归,除非dimension()明确检查EOF。我添加了打印错误消息的代码,如果'?'dim,则返回EOF。调用函数可以通过检查'?'来处理错误;当检测到错误时,程序可以改为exit()

另请注意,使用返回值声明的函数必须返回一个值。在这里,如果用户的输入是可接受的,则返回,否则返回再次调用dimension()的结果。

#include <stdio.h>

char dimension(void);
void clear_stdin(void);

int main(void)
{
    char c = dimension();

    printf("%c returned from dimension()\n", c);

    return 0;
}

char dimension(void)
{
    int dim;

    printf("2D or 3D?\n");
    dim = getchar();

    if (dim == EOF) {
        printf("Error or EOF in getchar()\n");
        return '?';
    }

    if (dim == '2' || dim == '3') {
        int c;
        if ((c = getchar()) == '\n' || c == EOF) {
            printf("You selected %cD\n",dim);
            return dim;
        }
    }

    clear_stdin();

    puts("Invalid selection");        
    return dimension();
}

void clear_stdin(void)
{
    int c;
    while((c = getchar()) != '\n' && c != EOF) {
        continue;
    }
}

示例互动

2D or 3D?
1 
Invalid selection
2D or 3D?
23
Invalid selection
2D or 3D?
4
Invalid selection
2D or 3D?
3
You selected 3D
3 returned from dimension()