C语言基于while循环与isdigit验证的猜数字游戏开发求助
C语言猜数字游戏实现方案
原有代码核心问题修复点
- 输入存储越界问题:原代码用单个
char类型存储用户输入,输入超过1个字符时会发生内存越界导致程序崩溃,替换为长度足够的字符数组存储输入字符串 - 多位数输入支持:新增逐字符校验逻辑,遍历输入字符串每个字符用
isdigit()校验是否为数字,全为数字后再合并转换为int类型,支持1~20范围内的多位数输入 - 随机数生成逻辑修复:原
srand(1-10)等价于固定种子,随机数不会变化,改为调用time()函数传入当前时间作为种子,保证每次运行生成的随机数不同 - 循环逻辑简化:删除冗余的
outOfGuess变量,直接用剩余猜测次数作为循环判断条件,逻辑更清晰易读 - 输入范围校验:新增数值范围判断,转换后的数字不在1~20区间时直接提示用户,符合需求要求
修正后完整代码
#include <stdio.h> #include <ctype.h> #include <stdlib.h> #include <time.h> int main() { // 生成1~20的随机数 srand(time(NULL)); int iRandomNum = (rand() % 20) + 1; char input_buf[32]; // 存储用户输入的字符串 int guessCount = 0; const int guessLimit = 3; int guessNum; int input_valid; while (guessCount < guessLimit) { printf("\n你还有%d次猜测机会", guessLimit - guessCount); printf("\n请输入1~20之间的数字:"); scanf("%s", input_buf); input_valid = 1; // 逐字符校验是否为数字 for (int i = 0; input_buf[i] != '\0'; i++) { if (!isdigit(input_buf[i])) { input_valid = 0; break; } } if (!input_valid) { printf("输入非法,请输入1~20之间的数字!\n"); guessCount++; // 若不需要非法输入扣次数可注释该行 continue; } // 字符串转整数 guessNum = atoi(input_buf); // 校验数值范围 if (guessNum < 1 || guessNum > 20) { printf("输入超出范围,请输入1~20之间的数字!\n"); guessCount++; // 若不需要范围错误扣次数可注释该行 continue; } // 判断猜测结果 if (guessNum == iRandomNum) { printf("恭喜你猜对了!\n"); return 0; } else if (guessNum > iRandomNum) { printf("猜大了!\n"); } else { printf("猜小了!\n"); } guessCount++; } // 次数用尽退出 printf("\n次数用尽,你输了!正确数字是%d\n", iRandomNum); return 0; }
关键逻辑说明
- 输入校验逻辑:遍历
input_buf里的每个字符,遇到非数字字符就标记输入非法,完美解决多位数输入的校验问题 - 字符串转数字:用标准库
atoi()函数直接把全数字的字符串转换为int类型,不需要自己手动写转换逻辑,代码更简洁高效 - 友好提示:猜错的时候额外提示猜大还是猜小,提升用户体验,不需要可以自行删除对应提示代码
内容的提问来源于stack exchange,提问作者NeonRyse
相关产品推荐
相关产品推荐

