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

C语言入门问题:循环初始化后字符串数组内容丢失

问题分析与解决

首先看你的代码,目前在循环内每次赋值后打印deck[k-1]是完全正常的——因为每次赋值完k自增,k-1刚好是当前牌的有效索引(0到51),而且你也正确给每个字符串设置了终止符deck[k][2] = 0,所以这时候打印没问题。

你说“完成所有赋值后再打印却无输出”,最可能的原因是你访问了数组越界的位置。

为什么会越界?

循环结束后,变量k的值是52(因为13种牌面×4种花色=52次循环,每次k++,初始k=0,最后k会变成52)。而你的deck数组只有52个元素,索引范围是0~51,如果这时候你直接用deck[k](也就是deck[52])来打印,就属于数组越界访问,这是C语言里的未定义行为——可能没有输出、输出乱码,甚至程序崩溃。

正确的打印方式

所有牌赋值完成后,你需要遍历deck的**有效索引范围(0到51)**来打印每一张牌,比如这样:

#include <stdio.h>

int main(void) { 
    char rank[] = "23456789TJQKA"; 
    char color[] = "cdhs"; 
    char deck[52][3]; 
    int k = 0; 

    // 生成所有牌
    for (int i = 0; i < 13; i++) { 
        for(int j = 0; j < 4; j++) { 
            deck[k][0] = rank[i]; 
            deck[k][1] = color[j]; 
            deck[k][2] = 0; 
            k++; 
        }
    }

    // 所有牌生成完成后,遍历打印
    for (int m = 0; m < 52; m++) {
        printf("%s\n", deck[m]);
    }

    return 0;
}

额外提醒

  • 一定要注意数组的索引范围,C语言不会自动检查数组越界,越界访问的行为完全不可控;
  • 你给deck定义的[52][3]是合理的——每张牌占2个字符(牌面+花色),加上1个字符串终止符,刚好3个位置。

内容的提问来源于stack exchange,提问作者Matěj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:46:32