指向指针的数组:管理不同语言的字符串

时间:2018-02-14 14:48:16

标签: c++ c arrays pointers

我目前有很多字符数组,用英语存储简单的字符串以供显示。我也有指向这些字符数组的指针。

char helloAr[20] = "Hello";
char timeAr[20] = "Time";
char dogAr[20] = "Dog";

char* helloPtr = helloAr;
char* timePtr = timeAr;
char* dogPtr = dogAr;

我正在用不同的语言添加更多字符数组,首先是法语。

char helloArFr[20] = "Bonjour";
char timeArFr[20] = "temps";
char dogArFr[20] = "chien";

如果用户选择法语,我计划更改所有指针(当前指向英文字符数组)指向的地址,因此它们现在指向法语字符数组。我假设我可以简单地为这些指针分配一个新值,

helloPtr = helloArFr;
timePtr = timeArFr;
dogPtr = dogArFr; 

但是我的实际代码会有很多数组,所以我想用一个循环来做这个而不是像上面那样的大量语句。

为此,我计划创建一个字符指针数组,指向我的字符数组的地址。

char* charArrAddresses [NUMBER_OF_TEXT_ARRAYS]=
{
    &helloAr,
    &timeAr,
    &dogAr,
    &helloArFr,
    &timeArFr,
    &dogArFr,
};

我还计划将所有指针存储在一个数组中,以便我可以在单个语句中通过它们在数组中的位置来引用它们,但这是我需要帮助的地方,因为我不确定如何执行此操作。这样的事可能吗?

char ** langPtrs[NUMBER_OF_LANG_POINTERS]=
{
    helloPtr,
    timePtr,
    dogPtr,
};

在循环内的单个语句中,我将使用所选语言和char数组的数量来计算charArrAddresses的正确索引,暂时调用此X。我将使用我的循环值(比如i)来索引我的langPtrs数组。所以在我的单身中想说些什么,

for(i = 0; i<NUMBER_OF_LANG_POINTERS; i++)
{
    langPtrs[i]= charArrAddresses[X];
}

我正在尝试将X的索引charArrAddresses中存储的字符数组的地址分配给i数组中索引langPtrs中的指针。我只是需要帮助确切地说明如何声明langPtrs数组以及如何编写上面的单个语句。

2 个答案:

答案 0 :(得分:9)

不是将所有语言的字符串放在单个数组中,而是创建字符串和语言的2D数组。如果您不打算修改任何这些字符串,可以使它们成为字符串文字而不是数组。

enum langs {
    LANG_ENGLISH,
    LANG_FRENCH,
    NUMBER_OF_LANGS
};

enum strings{
    STR_HELLO,
    STR_TIME,
    STR_DOG,
    NUMBER_OF_STRINGS
};

const char *langPtrs[NUMBER_OF_LANGS][NUMBER_OF_STRINGS]=
{
    { "Hello", "Time", "Dog" }
    { "Bonjour", "temps", "chien" }
};

由于enum中符号的值从0开始并且每个后续符号递增1,因此可以使用它们作为数组索引。每个enum的最后一个成员,与数组中的实际元素不对应,可以用作数组的大小。

因此,如果您想要打印字符串&#34; time&#34;用法语,你会用:

printf("%s\n", langPtrs[LANG_FRENCH][STR_TIME]);

如果您想要始终打印来自&#34; current&#34;就是语言,您可以为当前语言创建指向子数组的指针:

const char **currentLang = langPtrs[LANG_FRENCH];

然后你可以使用它:

printf("%s\n", currentLang[STR_TIME]);

编辑:

如果您想保留helloPtrtimePtrdogPtr,并且想要根据当前语言设置它们,可以将其地址放在另一个数组中:

const char **usedInClassesPtrs[NUMBER_OF_STRINGS] = {
    &helloPtr,
    &timePtr,
    &dogPtr
}

然后循环遍历数组,取消引用每个元素以提供您想要更改的实际指针,并根据当前语言为2D语言数组分配一个字符串,如下所示:

for (i=0; i<NUMBER_OF_STRINGS; i++) {
    *usedInClassesPtrs[i] = langPtrs[currentLang][i];
}

答案 1 :(得分:0)

@debush答案应该可以很好地运作。 从您的示例中我假设您的代码中一次只有一种语言处于活动状态。为此,我建议使用资源方法来管理您的多语言支持。您基本上可以加载语言的相应资源文件,并将其存储在std::vector<std::string>std::map<const enum/id/etc., std::string>或任何类似的数据结构中。这可以在运行中或在初始化阶段根据您的需要进行。在代码中,您可以通过调用std::vector<std::string>* ptr来保存指向此数据结构(*ptr)[index]的指针,以引用当前加载的语言。