编写乐透程序遇comparison between pointer and integer错误求助
解决乐透程序中的"comparison between pointer and integer"错误
你的代码出现的错误都是C语言字符串和基础类型操作的典型新手问题,下面逐个分析并给出修正方案:
核心错误原因
- 指针与整数直接比较:
a和b是字符数组,数组名本质是指向数组首地址的指针,a >= 0是把内存地址和整数0做比较,完全不是你要判断输入是否为0-36数字的逻辑。 - 字符串比较用
==:C语言中==比较的是字符串的内存地址,不是内容。判断字符串相等必须用strcmp()函数(返回0表示相等)。 - 字符串用单引号包裹:
'Red'是非法写法,单引号只能用于单个字符,字符串必须用双引号,比如"Red"。 - 逻辑判断优先级混乱:原代码中
||和&&的优先级没处理好,导致颜色判断的逻辑不符合预期,需要用括号明确分组。
修正后的完整代码
#include <stdio.h> #include <string.h> #include <stdlib.h> // 用于atoi字符串转整数函数 int main() { char input_a[10]; char input_b[10]; scanf("%s %s", input_a, input_b); // 将输入字符串转成整数,同时验证是否为有效0-36数字 int num_a = atoi(input_a); int num_b = atoi(input_b); // 额外判断:避免非数字字符串(如"abc")转成0后被误判为有效数字 int is_a_valid_num = (num_a >= 0 && num_a <= 36) && (strcmp(input_a, "0") == 0 || num_a != 0); int is_b_valid_num = (num_b >= 0 && num_b <= 36) && (strcmp(input_b, "0") == 0 || num_b != 0); // 情况1:两个都是有效数字且相等 if (is_a_valid_num && is_b_valid_num) { if (num_a == num_b) { printf("36ggr"); } else { printf("Inget vinst"); } } // 情况2:两个都是指定颜色且相等 else if ( (strcmp(input_a, "Red") == 0 || strcmp(input_a, "green") == 0 || strcmp(input_a, "black") == 0) && (strcmp(input_b, "Red") == 0 || strcmp(input_b, "green") == 0 || strcmp(input_b, "black") == 0) ) { if (strcmp(input_a, input_b) == 0) { printf("2ggr"); } else { printf("Inget vinst"); } } // 无效输入或不匹配的情况 else { printf("Inget vinst"); } return 0; }
关键改动说明
- 数字有效性判断:用
atoi()把字符串转成整数后,额外检查原字符串是否为"0"(避免非数字转成0的误判),确保输入确实是0-36的有效数字。 - 字符串比较:全部用
strcmp()替代==,正确判断字符串内容是否相等。 - 逻辑分组:给颜色判断的条件加上括号,确保逻辑是“a是指定颜色且b是指定颜色”,避免优先级导致的逻辑错误。
- 分支拆分:把数字和颜色的判断分成独立分支,代码逻辑更清晰,也避免了原代码中分支嵌套混乱的问题。
内容的提问来源于stack exchange,提问作者Masih MK
相关产品推荐
相关产品推荐

