You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言strcmp函数返回意外结果,游戏重玩循环代码修复求助

问题修复方案

核心问题分析

你的代码存在两个关键问题:

  1. 循环逻辑完全颠倒:原while条件strcmp(yn, "yes")==0||strcmp(yn, "no")==0表示输入yes/no时持续循环,这和「输入合法选项后退出循环」的需求完全矛盾。
  2. 潜在的缓冲区溢出风险:如果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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 04:30:58