foxiangzun 发表于 2021-11-6 22:10:11

函数指针和指针函数的程序警告问题

今天看了下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;
}

人造人 发表于 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;
}

人造人 发表于 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;
}

人造人 发表于 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;
}

人造人 发表于 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;
}

foxiangzun 发表于 2021-11-6 22:31:18

人造人 发表于 2021-11-6 22:27


感谢答复,这里是直接把 a 指针作为字符型变量指针去获取方法就行了么。。小甲鱼好像在视频里没讲。。{:5_100:}

人造人 发表于 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;
}

人造人 发表于 2021-11-6 22:32:34

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

没明白你的问题

foxiangzun 发表于 2021-11-6 22:34:12

人造人 发表于 2021-11-6 22:32
没明白你的问题

我用函数指针去接返回值(下面那段代码),为什么会报错呢?

人造人 发表于 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;
}

jhq999 发表于 2021-11-6 22:34:43

本帖最后由 jhq999 于 2021-11-6 22:36 编辑

看看代码
页: [1]
查看完整版本: 函数指针和指针函数的程序警告问题