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

C程序scanf用%s读字符串时出现参数类型不匹配编译警告

警告产生原因

C语言中,字符数组名str1在表达式中使用时,会默认退化为指向数组首元素的指针,类型为char *,这正是scanf的%s格式符要求的参数类型。
你代码中写的是&str1,这里对数组名取地址得到的是指向整个长度为20的字符数组的指针,类型为char (*)[20],和%s要求的char *类型不匹配,因此编译器触发-Wformat=类型检查警告。
你运行时看起来输出正常,是因为这两个指针指向的内存起始地址完全相同:str1的值是数组首元素的地址,&str1的值是整个数组的起始地址,二者地址数值一致,所以输入输出的内存读写位置没有错,不会立刻触发运行错误。但这种写法属于C标准定义的未定义行为,二者的指针步长完全不同:

  • 对str1做指针偏移(如str1 + 1),会向后移动1个字节(char类型的长度)
  • 对&str1做指针偏移(如&str1 + 1),会向后移动20个字节(整个str1数组的长度)
    如果后续代码基于这个错误类型的指针做运算,会直接出现内存访问错误。
正确修复方法
  • 去掉scanf参数中str1前多余的取地址符&,修改后的代码行如下:
    scanf("%s", str1);
    
  • (可选但强烈建议)为%s添加长度限制,避免用户输入过长内容导致缓冲区溢出,长度设置为数组长度减1(预留1字节存放字符串结束符\0):
    scanf("%19s", str1);
    

修复后的完整可编译无警告代码如下:

#include<stdio.h>
#include<stdlib.h>

int main()
{
    char str1[20];
    printf("Name: ");
    scanf("%19s", str1);
    printf("Your name is %s", str1);
    return 0;
}

补充说明:原代码中printf部分传入str1的写法完全符合类型要求,不需要修改。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 08:33:11