【问题标题】:C Program - How to assign values of a char* array to a 2d char* array?C 程序 - 如何将 char* 数组的值分配给 2d char* 数组?
【发布时间】:2021-12-25 17:15:28
【问题描述】:

我试图从 2 个字符指针数组中初始化一个 2d 数组,该数组表示一副纸牌,这些指针数组称为 faces 和 suit,表示纸牌的面孔和花色。我收到如下所示的各种错误,无法弄清楚如何正确地将值添加到我的牌组以及显示我的牌组。谁能向我指出需要更改哪些内容才能使我的代码正常工作?谢谢。

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

char **deck[4][13];

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

char** initializeDeck(char** arr)
{
    char addToString[] = " of ";
    for (int i = 0; i < 4; i++)
    {
        for (int j = 0; j < 13; j++)
        {
            arr[i][j] =  *faces[j], addToString, *suit[i]
        }
    }
    return arr;
}

void displayDeck(char** arr){
    for (int i = 0; i < 4; i++)
    {
        for (int j = 0; j < 13; j++)
        {
            printf("[%s] ", **arr[i][j]);
        }
        printf("\n");
    }
}

错误:

functions.c:35:37: warning: expression result unused [-Wunused-value]
            arr[i][j] =  *faces[j], addToString, *suit[i];
                                    ^~~~~~~~~~~
functions.c:35:50: warning: expression result unused [-Wunused-value]
            arr[i][j] =  *faces[j], addToString, *suit[i];
                                                 ^~~~~~~~
functions.c:46:30: error: indirection requires pointer operand ('int' invalid)
            printf("[%s] ", **arr[i][j]);

【问题讨论】:

  • 解释一下你认为这个声明在做什么arr[i][j] = *faces[j], addToString, *suit[i]?提示 - 它没有将字符串连接在一起。
  • @0___________ 老实说,这就是我的想法,我在某个地方看到了一种连接字符串的方法
  • 那你需要回到你的课本上。顺便说一句,整个代码没有太大意义。您需要重新考虑完全重写它。 **arr[i][j] - 你需要重读你书中的“指针和数组”一章。在此之前,很难帮助你
  • @0___________ 我的意思是我知道我的卡片组保存了指向字符串的指针,我只是无法找到用其他数组中的其他指针初始化它的语法
  • 否 - 您的 arr 指向 char 的指针。 c中的字符串是一个字符数组。所以你需要有指向char指针的指针。您需要为字符串分配空间。你不能这样索引它

标签: c pointers


【解决方案1】:
  1. arr[i][j] = *faces[j], addToString, *suit[i] 没有将字符串连接在一起。

这里有一些代码,但我认为你的老师不会相信那是你的代码

char *myconcat(const char *s1, const char *s2, const char *s3)
{
    size_t len = strlen(s1) + strlen(s2) + strlen(s3);
    char *newstr = malloc(len + 1);
    
    if(newstr)
    {
        strcpy(newstr, s1);
        strcat(newstr, s2);
        strcat(newstr, s3);
    }
    return newstr;
}


char *(*initializeDeck(void))[13]
{
    char *(*cards)[13] = malloc(4 *sizeof(*cards));
    for (int i = 0; i < 4; i++)
    {
        for (int j = 0; j < 13; j++)
        {
            cards[i][j] =  myconcat(faces[j], " of ", suit[i]);
        }
    }
    return cards;
}

void displayDeck(char *(*cards)[13]){
    for (int i = 0; i < 4; i++)
    {
        for (int j = 0; j < 13; j++)
        {
            printf("[%s] ", cards[i][j]);
        }
        printf("\n");
    }
}

【讨论】:

  • 哇,谢谢你这样做,我会参考你的代码并尝试更多地了解你建议的指针
  • 这有点高级,因为我使用指向指针数组的指针\
  • 是的,我可以肯定地说,我不能自己写,哈哈,那些指针函数?返回数组时函数头中的大小是必需的吗?我以前从未见过这种情况
  • 不,它不是函数指针。它是函数返回指向 13 个字符指针数组的指针
  • 如果添加和使用typedef char *faces_t[13];,代码会被简化
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-17
  • 2021-07-04
  • 1970-01-01
  • 2013-12-18
  • 2018-03-20
  • 2011-02-07
  • 1970-01-01
相关资源
最近更新 更多