[英]Array of pointers to pointers: managing strings for different languages
我目前有很多字符數組,用英語存儲簡單的字符串以供顯示。 我也有指向這些字符數組的指針。
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];
}
我試圖將存儲在charArrAddresses
索引X
中的字符數組的地址分配給langPtrs
數組中索引i
中的langPtrs
。 我只需要幫助確切地說明如何聲明langPtrs
數組以及如何編寫上面的單個語句。
不是將所有語言的字符串放在一個數組中,而是創建一個字符串和語言的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
的最后一個成員(與數組中的實際元素不對應)可以用作數組的大小。
因此,如果你想用法語打印“time”字符串,你可以使用:
printf("%s\n", langPtrs[LANG_FRENCH][STR_TIME]);
如果要始終從“當前”語言中打印字符串,可以創建指向當前語言的子數組的指針:
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];
}
@debush的答案應該很有效。 從您的示例中我假設您的代碼中一次只有一種語言處於活動狀態。 為此,我建議使用資源方法來管理您的多語言支持。 您基本上可以加載語言的相應資源文件並將其存儲在std::vector<std::string>
, std::map<const enum/id/etc., std::string>
或任何類似的數據結構中。 這可以在運行中或在初始化階段根據您的需要進行。 在你的代碼中,你保存一個指向這個數據結構std::vector<std::string>* ptr
的指針,通過調用(*ptr)[index]
來引用當前加載的語言。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.