C语言if语句处理字符遇编译警告,求解决方案
问题解决:字符/字符串不匹配导致的编译警告与命令触发失效
问题根源
- 编译警告原因:你代码里的
else if (cmd == "train")是直接用==比较单个字符cmd(整数类型)和字符串字面量"train"(指针类型),这属于指针与整数的非法比较,gcc因此抛出警告。你提到的if (cmd == 'e')本身是合法的字符间比较,大概率是行号显示误差。 - 命令无法触发的原因:
cmd是单个char变量,只能存储一个字符,而scanf("\n%c", &cmd)每次仅读取一个字符。当你输入"train"这类多字符命令时,程序会逐个读取't'、'r'、'a'等字符,永远无法匹配完整的"train"命令。
修复方案
需要将cmd改为字符串数组存储完整命令,并用标准字符串比较函数strcmp进行匹配,具体步骤:
- 将
char cmd;改为char cmd[20];(长度可根据需求调整,足够存储短命令即可) - 替换
scanf("\n%c", &cmd);为scanf("%s", cmd);(%s用于读取无空白的整段字符串) - 新增
<string.h>头文件,因为要使用strcmp函数 - 替换所有
==比较为strcmp调用:strcmp(cmd, "目标字符串") == 0表示两个字符串完全相等
修复后的完整代码
#include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <string.h> // 新增头文件,用于字符串比较函数strcmp int main() { char cmd[20]; // 改为字符串数组存储完整命令 while(true){ scanf("%s", cmd); // 读取整段无空白字符串 if (strcmp(cmd, "e") == 0){ // 匹配"e"命令 int e = system("./e"); } else if (strcmp(cmd, "train") == 0){ // 匹配"train"命令 int tr = system("sl"); } } return 0; }
额外说明
strcmp(a, b)返回0表示字符串a和b完全相等,返回负数表示a字典序小于b,正数表示a字典序大于b- 如果需要支持带空格的命令,不能用
%s,需替换为fgets读取整行,同时要注意处理输入末尾的换行符
内容的提问来源于stack exchange,提问作者zukas
相关产品推荐
相关产品推荐

