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
相关产品推荐
相关产品推荐

