簡體   English   中英

指向指針的數組:管理不同語言的字符串

[英]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]);

編輯:

如果要保留helloPtrtimePtrdogPtr ,並且想要根據當前語言設置它們,可以將它們的地址放在另一個數組中:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM