You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 14:59:08