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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 02:25:00