C++字符数组随机取值后条件判断异常问题排查
问题分析与解决:为什么你的C++代码始终输出"nu"?
我来帮你排查这个问题——你的代码确实永远不会触发"hey"的输出,核心问题出在字符与整数的类型不匹配上,咱们一步步拆解:
问题根源
你定义的arrayNum是char类型数组,里面的'6'是字符常量,它在内存中存储的是对应的ASCII码值(也就是数字54),而不是你以为的整数6。
当你执行int ceva = arrayNum[RandIndex];时,ceva拿到的是这个字符的ASCII数值。比如当随机选中'6'时,ceva的值是54,而你后续用ceva == 6做判断,54和6显然不相等,所以代码永远会进入else分支输出"nu"。
两种解决方法
方法1:直接比较字符(最简单)
不需要中间变量ceva,直接用字符常量'6'和数组元素比较,这样就不会有类型混淆的问题:
//libraries #include <iostream> #include <stdlib.h> #include <ctime> // 补充time()所需的头文件,避免编译警告 using namespace std; int main(){ srand ( time(NULL) ); //initialize the random seed const char arrayNum[4] = {'5', '6', '7', '8'}; int RandIndex = rand() % 4; //generates a random number between 0 and 3 cout << arrayNum[RandIndex]; // 直接比较字符常量 if (arrayNum[RandIndex] == '6'){ cout << "hey"; } else{ cout << "nu"; } }
方法2:将字符转换为对应整数
如果你一定要用int类型变量来判断,可以利用ASCII码的连续性,把字符转成对应的整数(字符'0'到'9'的ASCII码是连续递增的,减去'0'就能得到对应的数字):
//libraries #include <iostream> #include <stdlib.h> #include <ctime> using namespace std; int main(){ srand ( time(NULL) ); //initialize the random seed const char arrayNum[4] = {'5', '6', '7', '8'}; int RandIndex = rand() % 4; //generates a random number between 0 and 3 cout << arrayNum[RandIndex]; int ceva = arrayNum[RandIndex] - '0'; // 把字符转成对应整数 if (ceva == 6){ cout << "hey"; } else{ cout << "nu"; } }
额外提醒
原来的代码里使用了time(NULL),但没有包含<ctime>头文件,部分编译器会出现编译警告,所以上面的修正代码里已经补充了这个头文件。
内容的提问来源于stack exchange,提问作者Mădean Denis
相关产品推荐
相关产品推荐

