C nl_langinfo()-信息太多

C nl_langinfo()-信息太多,c,localization,locale,glibc,C,Localization,Locale,Glibc,函数nl\u langinfo(INT\u CURR\u SYMBOL)返回指向字符串常量的指针,其格式如下: $(THREE-LETTER-PSEUDOACRONYM) $(SIGN)$(SYMBOL) 所以在我的语言环境中(en_GB.UTF-8),这将是“GBP-”。我只需要前三个字母,那么除了为第三个元素指定nul字符,或者使用strncpy()之外,还有其他方法可以做到这一点吗 此外,nl_langinfo(CRNCYSTR)还返回符号和符号,而只返回需要的符号“-”->”国际货币符

函数
nl\u langinfo(INT\u CURR\u SYMBOL)
返回指向字符串常量的指针,其格式如下:

$(THREE-LETTER-PSEUDOACRONYM) $(SIGN)$(SYMBOL)
所以在我的语言环境中(
en_GB.UTF-8
),这将是
“GBP-”
。我只需要前三个字母,那么除了为第三个元素指定nul字符,或者使用
strncpy()
之外,还有其他方法可以做到这一点吗


此外,
nl_langinfo(CRNCYSTR)
还返回符号和符号,而只返回需要的符号<代码>“-”->
国际货币符号
似乎是GNU扩展。相反,我建议使用和
struct lconv
int\u curr\u symbol
字段。这是针对该领域的POSIX规范:

适用于当前区域设置的国际货币符号。前三个字符包含符合ISO 4217:1995标准规定的字母国际货币符号。第四个字符(紧跟在空字节之前)是用于将国际货币符号与货币数量分开的字符

正如你所看到的,它应该包含你得到的东西

关于第二种方法:

此外,nl_langinfo(CRNCYSTR)还返回符号和符号,而只返回需要的符号。“—”—“>”

这是因为符号定义了符号是放在值(+)之前、值(-)之后,还是应该替换基数字符()。这源于POSIX规范:

本地货币符号,如果符号应出现在值之前,则前面加“-”,如果符号应出现在值之后,则前面加“+”,如果符号应替换基数字符,则前面加“.”。如果本地货币符号为空字符串,则实现可能返回空字符串(“”)

至于获取字符串部分的方法,我建议在调用之后立即将返回值中的相关部分复制到您自己的缓冲区中。您必须这样做,因为任何一个函数返回的结构和各种指针都是由C库分配和维护的

POSIX给出的返回值的原因:

应用程序不得修改返回的字符串。nl_langinfo()返回的指针可能会无效,或者字符串内容可能会被任何线程中对nl_langinfo()的后续调用或同一线程或初始线程中对nl_langinfo_l()的后续调用所覆盖,这些调用包括与项的类别(请参阅)或LC_ALL类别对应的类别的setlocale(),或者通过对uselocale()的后续调用来更改与项的类别对应的类别。nl_langinfo_l()返回的指针可能无效,或者字符串内容可能会被同一线程中对nl_langinfo_l()的后续调用或任何线程中对nl_langinfo()的后续调用覆盖,或者被对freelocale()或newlocale()的后续调用覆盖,这些调用释放或修改传递给nl_langinfo_l()的locale对象

下面给出了类似的理由:

函数的作用是:返回一个指向填充对象的指针。应用程序不得修改返回值指向的结构,也不得修改结构内指针指向的任何存储区域。返回的指针和结构中的指针可能会无效,或者该结构或存储区域可能会被随后对localeconv()的调用覆盖。此外,返回的指针和结构中的指针可能会失效,或者结构或存储区域可能会被后续调用setlocale()的类别LC_ALL、LC_MONETARY或LC_NUMERIC覆盖,或者被调用uselocale()的类别LC_MONETARY或LC_NUMERIC覆盖


INT\u CURR\u SYMBOL
似乎是GNU扩展。相反,我建议使用和
struct lconv
int\u curr\u symbol
字段。这是针对该领域的POSIX规范:

适用于当前区域设置的国际货币符号。前三个字符包含符合ISO 4217:1995标准规定的字母国际货币符号。第四个字符(紧跟在空字节之前)是用于将国际货币符号与货币数量分开的字符

正如你所看到的,它应该包含你得到的东西

关于第二种方法:

此外,nl_langinfo(CRNCYSTR)还返回符号和符号,而只返回需要的符号。“—”—“>”

这是因为符号定义了符号是放在值(+)之前、值(-)之后,还是应该替换基数字符()。这源于POSIX规范:

本地货币符号,如果符号应出现在值之前,则前面加“-”,如果符号应出现在值之后,则前面加“+”,如果符号应替换基数字符,则前面加“.”。如果本地货币符号为空字符串,则实现可能返回空字符串(“”)

至于获取字符串部分的方法,我建议在调用之后立即将返回值中的相关部分复制到您自己的缓冲区中。您必须这样做,因为任何一个函数返回的结构和各种指针都是由C库分配和维护的

POSIX给出的返回值的原因:

应用程序不得修改返回的字符串。nl_langinfo()返回的指针可能会无效,或者字符串内容可能会被任何线程中对nl_langinfo()的后续调用或同一线程或初始线程中对nl_langinfo_l()的后续调用所覆盖,这些调用的类别与
strcpy(int_curr_symbol, nl_langinfo(INT_CURR_SYMBOL));  // "GBP -£"
int_curr_symbol[3] = '\0';

// or

strncpy(int_curr_symbol, nl_langinfo(INT_CURR_SYMBOL), 3));  // "GBP"