MSYS2编译C语言猜城市程序出现心形字符问题求助
问题分析与解决方法
问题原因
- 未初始化数组元素产生随机字符:
correctGuess是局部结构体数组,栈上未初始化的内存会保留随机垃圾值。第一个while循环中,i从0开始,先执行letter++和i++才对correctGuess[i]赋值,导致correctGuess[0]从未被初始化。MSYS2环境下该未初始化的letter字段恰好对应ASCII值0x03(显示为♥),而在线编译器的栈内存刚好是0或不可见字符,因此表现正常。 - 字母匹配索引逻辑错误:遍历城市字母匹配输入字符时,使用独立的
correctGuessIndex递增,导致正确匹配的字母没有存储到对应城市字母位置的correctGuess元素中,错位存储进一步暴露了未初始化的垃圾值。
解决方法
1. 全局初始化correctGuess数组
在使用数组前,遍历所有元素将letter初始化为'\0',避免垃圾值干扰:
// 随机选择城市后添加 for (int j = 0; j < 10; j++) { correctGuess[j].letter = '\0'; correctGuess[j].letterNumber = 0; }
2. 修正字母匹配的索引逻辑
去掉多余的correctGuessIndex,直接用城市字母的索引i作为correctGuess的索引,确保匹配结果存储到对应位置:
// 替换原匹配循环 for (int i = 0; i < letter; i++) { if(cities[random][i] == indexLetter){ correctGuess[i].letter = indexLetter; correctGuess[i].letterNumber = i; } }
3. 修复第一个while循环的初始化顺序
调整循环内的执行顺序,确保每个城市字母对应的correctGuess元素都被初始化:
i = 0; letter = 0; while (cities[random][i] != '\0') { correctGuess[i].letterNumber = i; correctGuess[i].letter = '\0'; letter++; i++; }
修正后的核心代码片段
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <time.h> struct correctGuess{ int letterNumber; char letter; }; int main() { srand(time(NULL)); char cities[][10] = { "antalya","ankara","istanbul","izmir","kutahya","bursa","konya","afyon","balikesir","mugla" }; char guessedLetter[30]; struct correctGuess correctGuess[10]; // 初始化correctGuess数组 for (int j = 0; j < 10; j++) { correctGuess[j].letter = '\0'; correctGuess[j].letterNumber = 0; } char indexLetter; int i = 0, guessCounter = 0; int letter = 0; int random = (int)(rand() % 10); // 修正后的城市字母计数与初始化 while (cities[random][i] != '\0') { correctGuess[i].letterNumber = i; correctGuess[i].letter = '\0'; letter++; i++; } for (int i = 0; i < letter; i++) { printf("_ "); if (i == (letter - 1)) { printf("\n"); } } printf("Sehri tahmin et!\n"); for (;;) { printf("Bir harf soyle\n"); scanf(" %c", &indexLetter); while (getchar() != '\n'); printf("Tahmin ettigin harf: %c\n", indexLetter); guessCounter++; guessedLetter[guessCounter] = indexLetter; // 修正后的匹配逻辑 for (int i = 0; i < letter; i++) { if(cities[random][i] == indexLetter){ correctGuess[i].letter = indexLetter; correctGuess[i].letterNumber = i; } } for(int i = 0; i < letter; i++){ if(correctGuess[i].letter == '\0'){ printf("_ "); }else{ printf("%c ",correctGuess[i].letter); } if(i == (letter - 1)){ printf("\n"); } } } return 0; }
内容的提问来源于stack exchange,提问作者Rynxie
相关产品推荐
相关产品推荐

