C语言Linux学习文本游戏的名字判断逻辑异常问题求助
问题分析与修复方案
代码中的核心错误
- 名字判断逻辑完全失效:
if("Linus Torvalds\n")是在判断字符串字面量的内存地址,该值永远非空,所以无论输入什么名字都会进入Richard Stallman分支,必须用strcmp进行字符串比较。 - 无法读取带空格的名字:
scanf("%s", name)会在空格处停止读取,输入"Linus Torvalds"时,name只会存储"Linus",导致后续匹配失败。 - 输入处理与条件逻辑混乱:
char yesno[1]长度不足,无法存储字符串终止符\0,导致strcmp行为异常。strcmp的返回值逻辑搞反了:返回0才表示字符串相等,原代码的条件判断完全颠倒了分支逻辑。scanf读取字符后残留的换行符会干扰后续输入,导致名字读取为空。
修复后的完整代码
#include <stdio.h> #include <stdlib.h> #include <string.h> // 调整全局变量长度,确保能容纳带空格的名字 char name[30]; char yesno; int main() { system("clear"); printf("???: Hello adventurer, are you here to learn Linux?\n"); printf("y/n\n"); // 读取用户输入的y/n,同时清理缓冲区残留的换行符 scanf("%c", &yesno); while ((getchar()) != '\n'); // 修正分支逻辑:输入y进入学习流程,n则退出 if (yesno == 'y') { printf("???: Great!, What is your name?\n"); // 用fgets读取整行输入,支持带空格的名字 fgets(name, sizeof(name), stdin); // 去掉fgets自动读取的换行符,避免影响字符串比较 size_t name_len = strlen(name); if (name_len > 0 && name[name_len - 1] == '\n') { name[name_len - 1] = '\0'; } // 精准匹配目标名字 if (strcmp(name, "Linus Torvalds") == 0) { printf("Achievment complete: In God We Trust\n"); printf("Nice to meet you!, my name is Richard Stallman.\n"); } else { printf("Nice to meet you!, my name is Linus Torvalds.\n"); } } else if (yesno == 'n') { printf("Ok!, bye!"); } else { printf("That's not an answer.\n"); } return 0; }
关键修改说明
- 名字匹配修复:用
strcmp(name, "Linus Torvalds") == 0替代无效的字面量判断,只有当输入名字完全匹配时才触发Richard Stallman分支。 - 支持带空格输入:改用
fgets读取整行内容,解决scanf("%s")无法处理空格的问题,同时手动移除换行符保证比较准确性。 - 输入逻辑修正:
- 将
yesno改为单个字符,直接用字符比较替代strcmp,避免字符串终止符的问题。 - 用
while ((getchar()) != '\n');清空输入缓冲区的残留换行符,防止后续读取名字时出错。 - 颠倒了原代码的分支逻辑,确保输入
y进入学习流程,输入n退出,符合需求描述。
- 将
内容的提问来源于stack exchange,提问作者Eminion
相关产品推荐
相关产品推荐

