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

Ubuntu下gcc编译含scanf的C代码出现格式匹配警告求助

问题原因

你遇到的是格式说明符与传入指针类型不匹配的编译告警,并非致命编译错误,你的代码实际上还是会生成可执行文件,但存在运行风险,具体原因如下:

  • scanf的%d格式符用于读取标准输入的十进制整数,要求传入的目标地址指针必须是int *类型;你声明的变量c是char类型,取地址后得到的&c是char *类型,和%d要求的参数类型不符,因此gcc抛出该告警。
  • 大学课程中老师说代码可正常运行,大概率是课程使用的编译器版本较旧、告警等级低,或是使用了Turbo C等老旧的16位编译环境,这类环境对类型匹配的检查不严格,不会触发该告警,甚至在小范围输入时不会触发异常,但这种写法本身属于C语言的未定义行为,不具备兼容性。
  • 额外风险说明:当前Ubuntu系统下int类型通常占4字节内存,char仅占1字节,用%d向char类型地址写数据时,会额外覆盖栈上相邻的3字节内存,轻则导致其他变量值异常,重则直接触发段错误崩溃。
修复方案

有两种常见的合规写法可以消除告警:

  • 调整变量类型为int,这是更推荐的写法,输出时int类型会自动转换为对应ASCII字符输出,修改后的代码如下:
#include <stdio.h>
int main()
{
    int c;
    printf("Inserire la codifica numerica :");
    scanf(" %d",&c);
    printf("La traduzione é %c\n",c);
    return 0;
}
  • 如果必须使用char类型存储数据,将scanf的格式符替换为%hhd即可,该格式符专门用于匹配char *类型的指针,修改对应行即可:
scanf(" %hhd",&c);

内容的提问来源于stack exchange,提问作者Tommaso Longo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 01:57:00