函数指针和指针函数的程序警告问题
今天看了下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了。。实在看不出来哪里有问题,请各位鱼油帮忙指点,谢谢! 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;
}
#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;
}
#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;
}
#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;
}
#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:27
感谢答复,这里是直接把 a 指针作为字符型变量指针去获取方法就行了么。。小甲鱼好像在视频里没讲。。{:5_100:} #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;
}
foxiangzun 发表于 2021-11-6 22:31
感谢答复,这里是直接把 a 指针作为字符型变量指针去获取方法就行了么。。小甲鱼好像在视频里没讲。。{:5 ...
没明白你的问题
人造人 发表于 2021-11-6 22:32
没明白你的问题
我用函数指针去接返回值(下面那段代码),为什么会报错呢? 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:36 编辑
看看代码
页:
[1]