C语言自定义输入校验函数调用strcmp出现整数转指针无强制类型转换警告
警告产生原因
strcmp函数的两个入参要求均为char*类型(指向字符串首地址的指针),但你自定义的check函数形参定义为char inp,属于单字符整数类型,类型不匹配。- main函数中定义的
inp是char[20]字符数组,作为参数传递时会自动退化为char*指针,但check函数用单字符类型接收该指针,相当于把字符串地址截断为单个整数值,再将该整数值作为地址传入strcmp,因此触发了「将整数转为指针未做强制类型转换」的编译警告。 - 逻辑直接写在main中可正常运行的原因是,main中直接访问
inp数组时,数组会自动转为合法的char*指针,符合strcmp的入参要求。
解决方案
核心修改
调整check函数的形参类型,改为接收字符串指针:
将原代码的
int check(char inp)
修改为
// 两种写法等价,数组形参会自动退化为指针 int check(char* inp) // 或者 int check(char inp[20])
附加修复
- 给
check函数中的c变量设置初始值,避免未匹配到选项时返回未初始化的垃圾值:
int c = 0; // 匹配失败时默认返回0
- 废弃不安全的
gets函数,替换为fgets避免缓冲区溢出风险,示例替换代码:
fgets(inp, sizeof(inp), stdin); // 去掉fgets读取到的末尾换行符 inp[strcspn(inp, "\n")] = '\0';
内容的提问来源于stack exchange,提问作者user15095227
相关产品推荐
相关产品推荐

