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

use*_*972 3 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;
Run Code Online (Sandbox Code Playgroud)

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

char helloArFr[20] = "Bonjour";
char timeArFr[20] = "temps";
char dogArFr[20] = "chien";
Run Code Online (Sandbox Code Playgroud)

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

helloPtr = helloArFr;
timePtr = timeArFr;
dogPtr = dogArFr; 
Run Code Online (Sandbox Code Playgroud)

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

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

char* charArrAddresses [NUMBER_OF_TEXT_ARRAYS]=
{
    &helloAr,
    &timeAr,
    &dogAr,
    &helloArFr,
    &timeArFr,
    &dogArFr,
};
Run Code Online (Sandbox Code Playgroud)

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

char ** langPtrs[NUMBER_OF_LANG_POINTERS]=
{
    helloPtr,
    timePtr,
    dogPtr,
};
Run Code Online (Sandbox Code Playgroud)

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

for(i = 0; i<NUMBER_OF_LANG_POINTERS; i++)
{
    langPtrs[i]= charArrAddresses[X];
}
Run Code Online (Sandbox Code Playgroud)

我试图分配存储在索引中的字符数组的地址XcharArrAddresses指针在指数i中的langPtrs阵列.我只需要帮助确切地说明如何声明langPtrs数组以及如何编写上面的单个语句.

dbu*_*ush 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" }
};
Run Code Online (Sandbox Code Playgroud)

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

因此,如果你想用法语打印"time"字符串,你可以使用:

printf("%s\n", langPtrs[LANG_FRENCH][STR_TIME]);
Run Code Online (Sandbox Code Playgroud)

如果要始终从"当前"语言中打印字符串,可以创建指向当前语言的子数组的指针:

const char **currentLang = langPtrs[LANG_FRENCH];
Run Code Online (Sandbox Code Playgroud)

然后你可以使用它:

printf("%s\n", currentLang[STR_TIME]);
Run Code Online (Sandbox Code Playgroud)

编辑:

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

const char **usedInClassesPtrs[NUMBER_OF_STRINGS] = {
    &helloPtr,
    &timePtr,
    &dogPtr
}
Run Code Online (Sandbox Code Playgroud)

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

for (i=0; i<NUMBER_OF_STRINGS; i++) {
    *usedInClassesPtrs[i] = langPtrs[currentLang][i];
}
Run Code Online (Sandbox Code Playgroud)

  • 如果是C++,并且你真的希望指针直接引用字符串文字,那么你将不得不将`const`放在那里.可能在C中也不是一个可怕的想法? (2认同)