为什么C语言开关灯函数传入指针参数时无法正常工作?
问题诊断
- 核心逻辑错误:你输入的是字符串形式的
"ON"/"OFF",但代码直接将字符串首字符的ASCII值传递给setLight的枚举参数,二者完全不匹配。比如"ON"的首字符是大写字母O,ASCII值为79,永远不会等于枚举定义的ON对应值1,所以分支永远不会触发。 - 内存分配不规范:你用
sizeof(lightSwitch)计算要申请的内存大小逻辑错误,存储字符串需要考虑字符长度+结束符\0的占用,且scanf("%s")没有限制输入长度,存在缓冲区溢出风险。 - 代码可读性差:
setLight中直接写setting == 1,应该直接用枚举常量ON做判断,降低维护难度。
修复方案
先将用户输入的字符串和"ON"/"OFF"做比较,转换为对应的lightSwitch枚举值后再传给setLight函数,修正后的完整代码如下:
#include "stdio.h" #include "stdlib.h" #include "string.h" typedef enum lightSwitch { OFF = 0, ON } lightSwitch; void setLight(lightSwitch setting){ if(setting == ON){ printf("(v)\n =\n"); } } int main(void){ // 分配足够存储输入的内存,这里开10字节足够容纳ON/OFF加结束符 char *p = malloc(10); if (p == NULL) { return 1; } printf("'ON' or 'OFF'?\n"); // 限制输入长度避免溢出 scanf("%9s", p); lightSwitch status; if (strcmp(p, "ON") == 0) { status = ON; } else { status = OFF; } setLight(status); free(p); return 0; }
内容的提问来源于stack exchange,提问作者mbed
相关产品推荐
相关产品推荐

