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

C程序中如何将char*数组值赋值给二维char*数组初始化扑克牌卡组

代码修正方案

核心错误梳理

  • 类型定义不匹配
    你声明的char **deck[4][13]是存储二级字符指针的二维数组,既没有为完整牌名分配存储内存,initializeDeck和displayDeck的char** arr参数也无法正确接收二维数组的传参。每张牌的完整名称是最长不超过20字节的字符串,直接将deck定义为三维字符数组char deck[4][13][20]即可满足存储需求。
  • 字符串拼接逻辑错误
    C语言的逗号运算符不会拼接字符串,你写的arr[i][j] = *faces[j], addToString, *suit[i]语句只会将最右侧的*suit[i](单个字符)赋值给左侧,中间两个表达式直接被丢弃,就是你看到前两个警告的原因。拼接字符串需要用snprintf、strcat等字符串处理函数,将牌面、连接符、花色拼接后写入对应内存。
  • 打印逻辑解引用错误
    printf的%s占位符要求传入字符串首地址(char*类型),你写的**arr[i][j]对值做了两次解引用,拿到的是单个字符值,不符合%s的参数要求,因此触发第三个报错。

修正后完整代码

#include <stdio.h>
#include <string.h>

// 三维数组:4种花色,13种牌面,每个牌名最长占20字节空间
char deck[4][13][20];

char *suit[] = {
    "Hearts",
    "Diamonds",
    "Clubs",
    "Spades"};
char *faces[] = {
    "Ace",
    "Two",
    "Three",
    "Four",
    "Five",
    "Six",
    "Seven",
    "Eight",
    "Nine",
    "Ten",
    "Jack",
    "Queen",
    "King",
};

// 参数改为接收三维字符数组
void initializeDeck(char arr[4][13][20])
{
    for (int i = 0; i < 4; i++)
    {
        for (int j = 0; j < 13; j++)
        {
            // 直接用snprintf格式化拼接字符串,安全方便
            snprintf(arr[i][j], 20, "%s of %s", faces[j], suit[i]);
        }
    }
}

void displayDeck(char arr[4][13][20]){
    for (int i = 0; i < 4; i++)
    {
        for (int j = 0; j < 13; j++)
        {
            // 直接传字符串首地址即可
            printf("[%s] ", arr[i][j]);
        }
        printf("\n");
    }
}

// 测试主函数示例
int main() {
    initializeDeck(deck);
    displayDeck(deck);
    return 0;
}

内容的提问来源于stack exchange,提问作者chessfordays

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 00:15:02