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

为什么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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 22:18:03