【问题标题】:How to access to 2D array of char* through structure?如何通过结构访问 char* 的二维数组?
【发布时间】:2021-04-12 09:28:04
【问题描述】:

这是一个 char* 的二维数组,例如存储不同语言的不同字符串:

typedef enum
{
    FRENCH,
    ENGLISH,
    GERMAN,
    LANGUAGES_COUNT
} languages_t;

typedef enum
{
    HELLO,
    THANK_YOU,
    WORDS_COUNT
} words_t;


char *text_tab[WORDS_COUNT][LANGUAGES_COUNT] =
{
    {"bonjour", "hello", "guten tag"},
    {"merci", "thank you", "danke"}
};

轻松访问它:

int main()
{
    printf("%s\n", text_tab[HELLO][ENGLISH]);
    printf("%s\n", text_tab[THANK_YOU][FRENCH]);
    printf("%s\n", text_tab[HELLO][GERMAN]);
   return 0;
}

现在,我不想直接访问 text_tab,而是通过一个结构:

typedef struct
{
  int a;
  char ***txt; // here is not working
} test_t;

test_t mystruct = {5, text_tab};

这个想法是通过这种方式访问​​ text_tab :

printf("%s\n", mystruct.txt[BONJOUR][ANGLAIS]);
printf("%s\n", mystruct.txt[MERCI][FRANCAIS]);
printf("%s\n", mystruct.txt[BONJOUR][ALLEMAND]);

如何在结构体中声明“txt”字段? 我只使用静态分配,我不想在“txt”中复制“text_tab”的内容,只是使用指针。

谢谢。

【问题讨论】:

    标签: c pointers multidimensional-array struct implicit-conversion


    【解决方案1】:

    这个数组

    char *text_tab[WORDS_COUNT][LANGUAGES_COUNT] =
    {
        {"bonjour", "hello", "guten tag"},
        {"merci", "thank you", "danke"}
    };
    

    类型为char * [WORDS_COUNT][LANGUAGES_COUNT]

    所以指向数组元素的指针的类型为char * ( * )[LANGUAGES_COUNT]

    因此结构可以这样声明

    typedef struct
    {
      size_t a;
      char * ( *txt )[LANGUAGES_COUNT];
    } test_t;
    

    在 main 中,您可以声明结构类型的对象,如

    test_t mystruct = { sizeof( text_tab ) / sizeof( *text_tab ), text_tab };
    

    这是一个演示程序。

    #include <stdio.h>
    
    #define WORDS_COUNT     2
    #define LANGUAGES_COUNT 3
    
    typedef struct
    {
        size_t a;
        char * ( *txt )[LANGUAGES_COUNT];
    } test_t;
    
    int main(void) 
    {
        char *text_tab[WORDS_COUNT][LANGUAGES_COUNT] =
        {
            {"bonjour", "hello", "guten tag"},
            {"merci", "thank you", "danke"}
        };
        
        test_t mystruct = { sizeof( text_tab ) / sizeof( *text_tab ), text_tab };
        
        for ( size_t i = 0; i < mystruct.a; i++ )
        {
            for ( size_t j = 0; j < sizeof( *mystruct.txt ) / sizeof( **mystruct.txt ); j++ )
            {
                printf( "%s ", mystruct.txt[i][j] );
            }
            putchar( '\n' );
        }
        
        return 0;
    }
    

    程序输出是

    bonjour hello guten tag 
    merci thank you danke 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-25
      • 2017-04-13
      • 2014-12-14
      • 2021-10-08
      • 1970-01-01
      • 1970-01-01
      • 2014-07-26
      相关资源
      最近更新 更多