我目前有很多字符数组,用英语存储简单的字符串以供显示。我也有指向这些字符数组的指针。
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
数组以及如何编写上面的单个语句。
答案 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]);
编辑:
如果您想保留helloPtr
,timePtr
和dogPtr
,并且想要根据当前语言设置它们,可以将其地址放在另一个数组中:
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]
的指针,以引用当前加载的语言。