C语言程序出现“指针与整数比较”警告的原因及解决方法
解决C语言中"comparing a pointer and an integer"警告的问题
嘿,我来帮你拆解这个问题,一步步搞定它!
先搞懂警告的含义
你代码里出现的这个警告,核心原因是类型不匹配的错误比较:
- 你定义的
maths和science是char类型变量,本质上是8位的整数(存储的是字符的ASCII码值,比如'Y'的ASCII是89)。 - 而你用来比较的
"Y"、"N"是字符串字面量,在C语言里,字符串字面量是一个指向字符数组首地址的指针(类型是char*),它存储的是这个字符串在内存中的地址,不是字符本身的值。
所以当你写maths == "Y"的时候,相当于拿一个整数(maths的ASCII值)和一个内存地址("Y"的指针)做比较,完全是风马牛不相及的两个东西,编译器当然会给你抛警告,而且这个比较逻辑本身也是完全错误的——你永远不会得到正确的判断结果。
如何解决这个问题?
需要做两处修改,不仅能消除警告,还能解决隐藏的输入问题:
1. 把字符串字面量改成字符字面量
把所有双引号包裹的"Y"、"N"换成单引号包裹的'Y'、'N'。单引号包裹的是字符字面量,类型是char,和你的变量类型完全匹配,这样比较的就是字符的ASCII值,逻辑才是正确的。
2. 修复输入缓冲区的残留问题
第一个scanf("%c", &maths);执行后,你输入完Y/N会按下回车,这个换行符\n会留在输入缓冲区里。第二个scanf("%c", &science);会直接读取这个换行符,导致science的值不是你输入的Y/N。解决方法是在第二个scanf的格式串前加一个空格:scanf(" %c", &science);,空格会自动跳过所有空白字符(包括换行、空格、制表符),确保读取到用户实际输入的字符。
修正后的完整代码
#include<stdio.h> int main() { char maths, science; printf("Have you passed maths exam ? If yes type Y and if no type N .\n"); scanf("%c", &maths); printf("Have you passed science exam ? If yes type Y and if no type N .\n"); scanf(" %c", &science); // 这里加了空格处理换行符 if (maths == 'Y' && science == 'Y') { printf("Congrats !! You will get 50 Rupees , please collect it from your teacher.\n"); } if (maths == 'Y' && science == 'N') { printf("Congrats !! You will get 15 Rupees , please collect it from your teacher.\n"); } if (maths == 'N' && science == 'Y') { printf("Congrats !! You will get 15 Rupees , please collect it from your teacher.\n"); } if (maths == 'N' && science == 'N') { printf("U get nothing , Sorry. \n"); } return 0; }
现在编译运行,警告就会消失,程序也能正确处理你的输入和判断逻辑啦!
内容的提问来源于stack exchange,提问作者Chetxn04
相关产品推荐
相关产品推荐

