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

