鱼C论坛

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

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

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

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. char *getWord(char);

  5. char *getWord(char c) {
  6.     switch(c) {
  7.     case 'a':
  8.         return "apple";
  9.     case 'b':
  10.         return "banana";
  11.     case 'c':
  12.         return "cat";
  13.     case 'd':
  14.         return "dog";
  15.     default:
  16.         return "None";
  17.     }
  18. }

  19. int main() {
  20.     char input;
  21.     char (*a)(char);
  22.     while(1) {
  23.         printf("请输入一个字母:");
  24.         scanf("%c", &input);
  25.         if(input != 'q') {
  26.             a = getWord(input);          //这里直接将参数带入了,系统会提示警告
  27.             printf("%s\n", (*a));
  28.             getchar();
  29.         } else {
  30.             printf("退出程序!");
  31.             break;
  32.         }
  33.     }

  34.     return 0;
  35. }
复制代码


上面的警告如下:
警告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 上去了,也没看到想要的答复。。
后来发现,是不是和视频里的代码有不一样的地方,于是做了修改,修改的内容如下:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. char *getWord(char);

  5. char *getWord(char c) {
  6.     switch(c) {
  7.     case 'a':
  8.         return "apple";
  9.     case 'b':
  10.         return "banana";
  11.     case 'c':
  12.         return "cat";
  13.     case 'd':
  14.         return "dog";
  15.     default:
  16.         return "None";
  17.     }
  18. }

  19. int main() {
  20.     char input;
  21.     char (*a)(char);
  22.     while(1) {
  23.         printf("请输入一个字母:");
  24.         scanf("%c", &input);
  25.         if(input != 'q') {
  26.             a = getWord;                         //把这里带入的参数拿掉了
  27.             printf("%s\n", (*a)(input));    //参数放到这里来了
  28.             getchar();
  29.         } else {
  30.             printf("退出程序!");
  31.             break;
  32.         }
  33.     }

  34.     return 0;
  35. }
复制代码


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

a 的类型不对

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. char *getWord(char);

  5. char *getWord(char c) {
  6.     switch(c) {
  7.     case 'a':
  8.         return "apple";
  9.     case 'b':
  10.         return "banana";
  11.     case 'c':
  12.         return "cat";
  13.     case 'd':
  14.         return "dog";
  15.     default:
  16.         return "None";
  17.     }
  18. }

  19. int main() {
  20.     char input;
  21.     //char (*a)(char);
  22.     char *(*a)(char);
  23.     while(1) {
  24.         printf("请输入一个字母:");
  25.         scanf("%c", &input);
  26.         if(input != 'q') {
  27.             a = getWord;                         //把这里带入的参数拿掉了
  28.             printf("%s\n", (*a)(input));    //参数放到这里来了
  29.             getchar();
  30.         } else {
  31.             printf("退出程序!");
  32.             break;
  33.         }
  34.     }

  35.     return 0;
  36. }
复制代码

最佳答案

查看完整内容

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

使用道具 举报

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

a 的类型不对

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. char *getWord(char);

  5. char *getWord(char c) {
  6.     switch(c) {
  7.     case 'a':
  8.         return "apple";
  9.     case 'b':
  10.         return "banana";
  11.     case 'c':
  12.         return "cat";
  13.     case 'd':
  14.         return "dog";
  15.     default:
  16.         return "None";
  17.     }
  18. }

  19. int main() {
  20.     char input;
  21.     //char (*a)(char);
  22.     char *(*a)(char);
  23.     while(1) {
  24.         printf("请输入一个字母:");
  25.         scanf("%c", &input);
  26.         if(input != 'q') {
  27.             a = getWord;                         //把这里带入的参数拿掉了
  28.             printf("%s\n", (*a)(input));    //参数放到这里来了
  29.             getchar();
  30.         } else {
  31.             printf("退出程序!");
  32.             break;
  33.         }
  34.     }

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

使用道具 举报

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

  4. //char *getWord(char);

  5. char *getWord(char c) {
  6.     switch(c) {
  7.     case 'a':
  8.         return "apple";
  9.     case 'b':
  10.         return "banana";
  11.     case 'c':
  12.         return "cat";
  13.     case 'd':
  14.         return "dog";
  15.     default:
  16.         return "None";
  17.     }
  18. }

  19. int main() {
  20.     char input;
  21.     //char (*a)(char);
  22.     char *a;
  23.     while(1) {
  24.         printf("请输入一个字母:");
  25.         scanf("%c", &input);
  26.         if(input != 'q') {
  27.             a = getWord(input);          //这里直接将参数带入了,系统会提示警告
  28.             //printf("%s\n", (*a));
  29.             printf("%s\n", a);
  30.             getchar();
  31.         } else {
  32.             //printf("退出程序!");
  33.             printf("退出程序!\n");
  34.             break;
  35.         }
  36.     }

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

使用道具 举报

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

  4. //char *getWord(char);

  5. char *getWord(char c) {
  6.     switch(c) {
  7.     case 'a':
  8.         return "apple";
  9.     case 'b':
  10.         return "banana";
  11.     case 'c':
  12.         return "cat";
  13.     case 'd':
  14.         return "dog";
  15.     default:
  16.         return "None";
  17.     }
  18. }

  19. int main() {
  20.     char input;
  21.     //char (*a)(char);
  22.     char *(*a)(char);
  23.     while(1) {
  24.         printf("请输入一个字母:");
  25.         scanf("%c", &input);
  26.         if(input != 'q') {
  27.             //a = getWord(input);          //这里直接将参数带入了,系统会提示警告
  28.             a = getWord;
  29.             char *x = a(input);
  30.             //printf("%s\n", (*a));
  31.             printf("%s\n", x);
  32.             getchar();
  33.         } else {
  34.             //printf("退出程序!");
  35.             printf("退出程序!\n");
  36.             break;
  37.         }
  38.     }

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

使用道具 举报

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

  4. //char *getWord(char);

  5. char *getWord(char c) {
  6.     switch(c) {
  7.     case 'a':
  8.         return "apple";
  9.     case 'b':
  10.         return "banana";
  11.     case 'c':
  12.         return "cat";
  13.     case 'd':
  14.         return "dog";
  15.     default:
  16.         return "None";
  17.     }
  18. }

  19. int main() {
  20.     char input;
  21.     //char (*a)(char);
  22.     char *(*a)(char);
  23.     while(1) {
  24.         printf("请输入一个字母:");
  25.         scanf("%c", &input);
  26.         if(input != 'q') {
  27.             //a = getWord(input);          //这里直接将参数带入了,系统会提示警告
  28.             a = getWord;
  29.             //printf("%s\n", (*a));
  30.             printf("%s\n", (*a)(input));
  31.             getchar();
  32.         } else {
  33.             //printf("退出程序!");
  34.             printf("退出程序!\n");
  35.             break;
  36.         }
  37.     }

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

使用道具 举报

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

  4. //char *getWord(char);

  5. char *getWord(char c) {
  6.     switch(c) {
  7.     case 'a':
  8.         return "apple";
  9.     case 'b':
  10.         return "banana";
  11.     case 'c':
  12.         return "cat";
  13.     case 'd':
  14.         return "dog";
  15.     default:
  16.         return "None";
  17.     }
  18. }

  19. int main() {
  20.     char input;
  21.     //char (*a)(char);
  22.     char *(*a)(char);
  23.     while(1) {
  24.         printf("请输入一个字母:");
  25.         scanf("%c", &input);
  26.         if(input != 'q') {
  27.             //a = getWord(input);          //这里直接将参数带入了,系统会提示警告
  28.             a = getWord;
  29.             //printf("%s\n", (*a));
  30.             printf("%s\n", a(input));
  31.             getchar();
  32.         } else {
  33.             //printf("退出程序!");
  34.             printf("退出程序!\n");
  35.             break;
  36.         }
  37.     }

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

使用道具 举报

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

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

使用道具 举报

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

  4. //char *getWord(char);

  5. char *getWord(char c) {
  6.     switch(c) {
  7.     case 'a':
  8.         return "apple";
  9.     case 'b':
  10.         return "banana";
  11.     case 'c':
  12.         return "cat";
  13.     case 'd':
  14.         return "dog";
  15.     default:
  16.         return "None";
  17.     }
  18. }

  19. int main() {
  20.     char input;
  21.     //char (*a)(char);
  22.     char *(*a)(char) = getWord;
  23.     while(1) {
  24.         printf("请输入一个字母:");
  25.         scanf("%c", &input);
  26.         if(input != 'q') {
  27.             //a = getWord(input);          //这里直接将参数带入了,系统会提示警告
  28.             //printf("%s\n", (*a));
  29.             printf("%s\n", a(input));
  30.             getchar();
  31.         } else {
  32.             //printf("退出程序!");
  33.             printf("退出程序!\n");
  34.             break;
  35.         }
  36.     }

  37.     return 0;
  38. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> 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 ...
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. //char *getWord(char);

  5. char *getWord(char c) {
  6.     switch(c) {
  7.     case 'a':
  8.         return "apple";
  9.     case 'b':
  10.         return "banana";
  11.     case 'c':
  12.         return "cat";
  13.     case 'd':
  14.         return "dog";
  15.     default:
  16.         return "None";
  17.     }
  18. }

  19. int main() {
  20.     char input;
  21.     //char (*a)(char);
  22.     char *(*b)(char) = getWord;
  23.     while(1) {
  24.         printf("请输入一个字母:");
  25.         scanf("%c", &input);
  26.         if(input != 'q') {
  27.             //a = getWord(input);          //这里直接将参数带入了,系统会提示警告
  28.             char *x = b(input);
  29.             char **a = &x;
  30.             printf("%s\n", (*a));
  31.             getchar();
  32.         } else {
  33.             //printf("退出程序!");
  34.             printf("退出程序!\n");
  35.             break;
  36.         }
  37.     }

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

使用道具 举报

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

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-25 17:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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