鱼C论坛

 找回密码
 立即注册
查看: 1584|回复: 11

[已解决]函数指针和指针函数的程序警告问题

[复制链接]
发表于 2021-11-6 22:10:11 | 显示全部楼层 |阅读模式
5鱼币
今天看了下C语言的教程,函数指针和指针函数的部分,发现一个问题,没太明白,下面直接上代码,问题部分在注释中:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *getWord(char);

char *getWord(char c) {
    switch(c) {
    case 'a':
        return "apple";
    case 'b':
        return "banana";
    case 'c':
        return "cat";
    case 'd':
        return "dog";
    default:
        return "None";
    }
}

int main() {
    char input;
    char (*a)(char);
    while(1) {
        printf("请输入一个字母:");
        scanf("%c", &input);
        if(input != 'q') {
            a = getWord(input);          //这里直接将参数带入了,系统会提示警告
            printf("%s\n", (*a));
            getchar();
        } else {
            printf("退出程序!");
            break;
        }
    }

    return 0;
}

上面的警告如下:
警告1:warning: assignment to 'char (*)(char)' from incompatible pointer type 'char *' [-Wincompatible-pointer-types]
警告2:warning: format '%s' expects argument of type 'char *', but argument 2 has type 'char (*)(char)' [-Wformat=]

在度娘上找了一圈,甚至都跑到 StackOverflow 上去了,也没看到想要的答复。。
后来发现,是不是和视频里的代码有不一样的地方,于是做了修改,修改的内容如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *getWord(char);

char *getWord(char c) {
    switch(c) {
    case 'a':
        return "apple";
    case 'b':
        return "banana";
    case 'c':
        return "cat";
    case 'd':
        return "dog";
    default:
        return "None";
    }
}

int main() {
    char input;
    char (*a)(char);
    while(1) {
        printf("请输入一个字母:");
        scanf("%c", &input);
        if(input != 'q') {
            a = getWord;                         //把这里带入的参数拿掉了
            printf("%s\n", (*a)(input));    //参数放到这里来了
            getchar();
        } else {
            printf("退出程序!");
            break;
        }
    }

    return 0;
}

这样调整过后,编译能通过,且警告没有变化,但是运行的时候,输入字符,程序就gg了。。实在看不出来哪里有问题,请各位鱼油帮忙指点,谢谢!
最佳答案
2021-11-6 22:10:12
foxiangzun 发表于 2021-11-6 22:34
我用函数指针去接返回值(下面那段代码),为什么会报错呢?

a 的类型不对
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *getWord(char);

char *getWord(char c) {
    switch(c) {
    case 'a':
        return "apple";
    case 'b':
        return "banana";
    case 'c':
        return "cat";
    case 'd':
        return "dog";
    default:
        return "None";
    }
}

int main() {
    char input;
    //char (*a)(char);
    char *(*a)(char);
    while(1) {
        printf("请输入一个字母:");
        scanf("%c", &input);
        if(input != 'q') {
            a = getWord;                         //把这里带入的参数拿掉了
            printf("%s\n", (*a)(input));    //参数放到这里来了
            getchar();
        } else {
            printf("退出程序!");
            break;
        }
    }

    return 0;
}

最佳答案

查看完整内容

a 的类型不对
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-6 22:10:12 | 显示全部楼层    本楼为最佳答案   
foxiangzun 发表于 2021-11-6 22:34
我用函数指针去接返回值(下面那段代码),为什么会报错呢?

a 的类型不对
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *getWord(char);

char *getWord(char c) {
    switch(c) {
    case 'a':
        return "apple";
    case 'b':
        return "banana";
    case 'c':
        return "cat";
    case 'd':
        return "dog";
    default:
        return "None";
    }
}

int main() {
    char input;
    //char (*a)(char);
    char *(*a)(char);
    while(1) {
        printf("请输入一个字母:");
        scanf("%c", &input);
        if(input != 'q') {
            a = getWord;                         //把这里带入的参数拿掉了
            printf("%s\n", (*a)(input));    //参数放到这里来了
            getchar();
        } else {
            printf("退出程序!");
            break;
        }
    }

    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-6 22:27:23 | 显示全部楼层
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//char *getWord(char);

char *getWord(char c) {
    switch(c) {
    case 'a':
        return "apple";
    case 'b':
        return "banana";
    case 'c':
        return "cat";
    case 'd':
        return "dog";
    default:
        return "None";
    }
}

int main() {
    char input;
    //char (*a)(char);
    char *a;
    while(1) {
        printf("请输入一个字母:");
        scanf("%c", &input);
        if(input != 'q') {
            a = getWord(input);          //这里直接将参数带入了,系统会提示警告
            //printf("%s\n", (*a));
            printf("%s\n", a);
            getchar();
        } else {
            //printf("退出程序!");
            printf("退出程序!\n");
            break;
        }
    }

    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-6 22:28:40 | 显示全部楼层
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//char *getWord(char);

char *getWord(char c) {
    switch(c) {
    case 'a':
        return "apple";
    case 'b':
        return "banana";
    case 'c':
        return "cat";
    case 'd':
        return "dog";
    default:
        return "None";
    }
}

int main() {
    char input;
    //char (*a)(char);
    char *(*a)(char);
    while(1) {
        printf("请输入一个字母:");
        scanf("%c", &input);
        if(input != 'q') {
            //a = getWord(input);          //这里直接将参数带入了,系统会提示警告
            a = getWord;
            char *x = a(input);
            //printf("%s\n", (*a));
            printf("%s\n", x);
            getchar();
        } else {
            //printf("退出程序!");
            printf("退出程序!\n");
            break;
        }
    }

    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-6 22:30:25 | 显示全部楼层
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//char *getWord(char);

char *getWord(char c) {
    switch(c) {
    case 'a':
        return "apple";
    case 'b':
        return "banana";
    case 'c':
        return "cat";
    case 'd':
        return "dog";
    default:
        return "None";
    }
}

int main() {
    char input;
    //char (*a)(char);
    char *(*a)(char);
    while(1) {
        printf("请输入一个字母:");
        scanf("%c", &input);
        if(input != 'q') {
            //a = getWord(input);          //这里直接将参数带入了,系统会提示警告
            a = getWord;
            //printf("%s\n", (*a));
            printf("%s\n", (*a)(input));
            getchar();
        } else {
            //printf("退出程序!");
            printf("退出程序!\n");
            break;
        }
    }

    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-6 22:31:07 | 显示全部楼层
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//char *getWord(char);

char *getWord(char c) {
    switch(c) {
    case 'a':
        return "apple";
    case 'b':
        return "banana";
    case 'c':
        return "cat";
    case 'd':
        return "dog";
    default:
        return "None";
    }
}

int main() {
    char input;
    //char (*a)(char);
    char *(*a)(char);
    while(1) {
        printf("请输入一个字母:");
        scanf("%c", &input);
        if(input != 'q') {
            //a = getWord(input);          //这里直接将参数带入了,系统会提示警告
            a = getWord;
            //printf("%s\n", (*a));
            printf("%s\n", a(input));
            getchar();
        } else {
            //printf("退出程序!");
            printf("退出程序!\n");
            break;
        }
    }

    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-11-6 22:31:18 | 显示全部楼层

感谢答复,这里是直接把 a 指针作为字符型变量指针去获取方法就行了么。。小甲鱼好像在视频里没讲。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-6 22:31:49 | 显示全部楼层
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//char *getWord(char);

char *getWord(char c) {
    switch(c) {
    case 'a':
        return "apple";
    case 'b':
        return "banana";
    case 'c':
        return "cat";
    case 'd':
        return "dog";
    default:
        return "None";
    }
}

int main() {
    char input;
    //char (*a)(char);
    char *(*a)(char) = getWord;
    while(1) {
        printf("请输入一个字母:");
        scanf("%c", &input);
        if(input != 'q') {
            //a = getWord(input);          //这里直接将参数带入了,系统会提示警告
            //printf("%s\n", (*a));
            printf("%s\n", a(input));
            getchar();
        } else {
            //printf("退出程序!");
            printf("退出程序!\n");
            break;
        }
    }

    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-6 22:32:34 | 显示全部楼层
foxiangzun 发表于 2021-11-6 22:31
感谢答复,这里是直接把 a 指针作为字符型变量指针去获取方法就行了么。。小甲鱼好像在视频里没讲。。{:5 ...

没明白你的问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-11-6 22:34:12 | 显示全部楼层

我用函数指针去接返回值(下面那段代码),为什么会报错呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-6 22:34:13 | 显示全部楼层
foxiangzun 发表于 2021-11-6 22:31
感谢答复,这里是直接把 a 指针作为字符型变量指针去获取方法就行了么。。小甲鱼好像在视频里没讲。。{:5 ...
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//char *getWord(char);

char *getWord(char c) {
    switch(c) {
    case 'a':
        return "apple";
    case 'b':
        return "banana";
    case 'c':
        return "cat";
    case 'd':
        return "dog";
    default:
        return "None";
    }
}

int main() {
    char input;
    //char (*a)(char);
    char *(*b)(char) = getWord;
    while(1) {
        printf("请输入一个字母:");
        scanf("%c", &input);
        if(input != 'q') {
            //a = getWord(input);          //这里直接将参数带入了,系统会提示警告
            char *x = b(input);
            char **a = &x;
            printf("%s\n", (*a));
            getchar();
        } else {
            //printf("退出程序!");
            printf("退出程序!\n");
            break;
        }
    }

    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-6 22:34:43 | 显示全部楼层
本帖最后由 jhq999 于 2021-11-6 22:36 编辑

看看代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-10 11:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表