【问题标题】:How to access a string in a struct of pointers?如何访问指针结构中的字符串?
【发布时间】:2015-09-14 18:17:35
【问题描述】:

我有一个结构:

struct dispPara
{   
    char *english,   
    char *french,
    void            *value;             
    unsigned char    type;          
    unsigned char    units;                 
};

struct dispPara dispParas[5] =
{

 {"abc_english", "xyz_frnch", &blah, blah, blah},

 {"english",  "frnch", &blah, blah, blah},

}

我正在访问英文字符串:dispParas[i].english。现在,默认是英文字符串,如果有人将语言更改为法语,则指针应该打印法语。如何使用指针访问法语字符串?

谢谢。

【问题讨论】:

    标签: c arrays multidimensional-array structure multilingual


    【解决方案1】:

    不清楚你真正想要什么。但如果是为了国际化,你就做错了,因为你不能索引到struct

    相反,您应该为每种语言(包含所有字符串)使用 const char *[] 和指向当前语言数组的 const char **。 然后字符串将是current_language[text_index]

    当然,数组在同一索引处必须具有相同的含义。更清楚地说,您应该为每个文本使用enum,而不是数字索引:

    const char *text_english[] = { "Hello", "World" };
    const char *text_german[] = { "Hallo", "Welt" };
    
    typedef enum {
        TEXT_HELLO = 0,
        TEXT_WORLD,
    } TextCodes;
    
    const char **current_language = text_english;
    
    ...
    
    int main(void)
    {
        printf("%s %s!", current_language[TEXT_HELLO], current_language[TEXT_WORLD]);
    }
    

    另一种方法是使用二维数组:

    #define NUM_LANGUAGES 2
    
    const char *text_strings[][NUM_LANGUAGES] = {
        { "Hello", "Hallo", },
        { "World", "Welt", },
    };
    
    ...
    
    size_t lang = 1; // german
    printf("%s %s", text_strings[0][lang], text_strings[1][lang]);
    

    上面的enums可以用同样的方法。这里的问题是,添加一种新语言需要更改整个数组,而不仅仅是添加一种新语言。

    【讨论】:

    • 奥拉夫,感谢您的回复。
    • 奥拉夫,感谢您的回复。目前,我正在按照您上面解释的方式进行操作,但我很想知道是否可以采用其他方式。我试过这样: int (*lang_ptr)[50] = dispParas[0].english and ++lang_ptr;当用户将语言更改为法语时:(*lang_ptr)[50] = dispParas[0].french。但它没有正常工作。我不知道这是否有意义。再次感谢。
    • @Amar:它更复杂,因为你不能索引到一个结构,所以你需要一个开关来获取成员。我将添加到我的答案中的另一种方法。
    • @Amar:我添加了另一种方法 - 但仍然没有结构(由于给出的原因)。
    • 感谢您的回复。第二种解决方案看起来更好。谢谢。
    猜你喜欢
    • 2012-07-31
    • 2011-08-11
    • 2019-07-10
    • 2020-03-23
    • 2012-05-05
    • 2014-11-03
    • 1970-01-01
    • 2018-07-14
    • 1970-01-01
    相关资源
    最近更新 更多