C语言strcmp函数返回意外结果,游戏重玩循环代码修复求助
问题修复方案
核心问题分析
你的代码存在两个关键问题:
- 循环逻辑完全颠倒:原
while条件strcmp(yn, "yes")==0||strcmp(yn, "no")==0表示输入yes/no时持续循环,这和「输入合法选项后退出循环」的需求完全矛盾。 - 潜在的缓冲区溢出风险:如果
yn未定义为足够长度的字符数组(比如char yn[4];),或者scanf未限制输入长度,会导致内存溢出问题;另外数组名本身就是指针,scanf("%s", yn)即可,不需要加&。
修复后的代码
#include <stdio.h> #include <string.h> int main() { char yn[4]; // 足够存储"yes"/"no"及字符串结束符 do { setbuf(stdout, NULL); printf("Do you want to play again(yes/no): "); scanf("%3s", yn); // 限制输入长度,避免缓冲区溢出 // 清理输入缓冲区残留的换行符,防止后续读取异常 while(getchar() != '\n'); } while(strcmp(yn, "yes") != 0 && strcmp(yn, "no") != 0); // 输入非法时继续循环 // 根据用户选择执行对应逻辑 if(strcmp(yn, "yes") == 0) { printf("Restarting the game...\n"); // 此处添加重玩游戏的代码 } else { printf("Exiting the game...\n"); // 此处添加退出游戏的代码 } return 0; }
关键修改说明
- 修正循环条件:仅当输入既不是
yes也不是no时,才继续循环提示用户输入合法选项。 - 限制输入长度:用
%3s确保输入不会超出yn数组的容量,避免内存溢出。 - 清理输入缓冲区:通过
while(getchar() != '\n');吃掉用户输入后多余的换行符,防止后续输入操作直接读取残留内容导致异常。
内容的提问来源于stack exchange,提问作者Baka Pratish
相关产品推荐
相关产品推荐

