C语言无重复字母Hangman游戏首字符不参与匹配问题求助
问题根因
第一个字符无法匹配的核心问题出在单词长度统计与下划线初始化的循环逻辑上,同时代码还存在多处逻辑结构错误、输入类型不匹配问题:
- 下划线初始化逻辑错位
原有统计单词长度的while循环中,先执行i++再给d[i]赋值下划线,导致d[0]始终未初始化,第一个字符的匹配结果无法写入输出数组,同时统计得到的n值比实际单词长度大1,后续总字母数、胜利条件都用n-1做判断,天然跳过了输入单词的第一个字符,所以只有加下划线前缀占位第一个字符才能正常运行。 - 字符输入类型不匹配
变量s是char类型,你使用%s格式符输入,%s会读取字符串并自动在末尾追加\0,会额外写入一个字节到栈空间,造成栈溢出,破坏相邻变量的值。 - 逻辑结构错位
判断猜中次数、错误计数的代码被写在了遍历单词字母的for循环内部,每遍历一个字母就会触发一次判断,逻辑完全混乱。 - 输出数组无结束符
d数组作为字符串输出时没有手动追加\0结束符,会输出随机垃圾字符。
修复后的完整代码
#include<stdio.h> #define maxchar 10 int main(){ int i=0,n=0,j=0,b=0; int m; char a[maxchar]; char s; char d[maxchar]; printf("Welcome to hangman :)\n"); printf("Enter word with no repeating letters (no underscore prefix needed):"); scanf("%s",a); // 统计单词长度+初始化猜词下划线数组 while(a[i]!='\0'){ d[i]='_'; i++; n++; } d[n] = '\0'; // 补充字符串结束符 printf("%s",d); printf("\nThe total no. of letters is %d\n",n); while(j!=4){ printf("\nEnter a letter (don't repeat):\n"); scanf(" %c",&s); // 加空格跳过缓冲区残留换行,用%c读取单个字符 int found = 0; for(i=0;i<n;i++){ if(a[i]==s){ printf("correct and at position %d\n",i); d[i]=s; b++; found = 1; break; } } printf("%s\n",d); // 遍历完全部字符后再做状态判断 if(b==n){ printf("\nHurray!! U guessed the word"); return 0; } m=j; if(!found) j++; if(m<j) { if(j==1) printf(" !\n o\n\n"); else if(j==2) printf(" !\n o\n |\n\n"); else if(j==3) printf(" !\n o\n-|-\n\n"); else if(j==4){ printf(" !\n o\n-|-\n ^\n"); return 0; } } } }
修复说明
- 调整了while循环内的执行顺序,先给
d[i]赋值再自增i,保证第一个字符的位置正常初始化,统计得到的n等于实际单词长度 - 字符输入改为
%c格式符,前面加空格跳过缓冲区残留的换行符,避免读入空字符 - 新增found标记判断是否猜中,把胜利判断、错误计数的逻辑移到for循环外部,保证遍历完所有字母后再做状态判断
- 给
d数组补充字符串结束符,避免输出乱码 - 调整胜利条件为
b==n,总字母数直接输出n,无需再减1,不需要加下划线前缀即可正常输入单词
内容的提问来源于stack exchange,提问作者SHASHANK N
相关产品推荐
相关产品推荐

