函数返回一个指向字符串常量的指针,其格式为:
$(THREE-LETTER-PSEUDOACRONYM) $(SIGN)$(SYMBOL)
所以在我的语言环境中(
nl_langinfo(INT_CURR_SYMBOL)
),这就是en_GB.UTF-8
。我只想要前三个字母,那么除了给第三个元素分配一个nul字符,或者使用"GBP -£"
,还有别的方法吗?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"
此外,
strncpy()
还返回符号和符号,而只需要中的符号。nl_langinfo(CRNCYSTR)
>"-£"
最佳答案
INT_CURR_SYMBOL
似乎是GNU的扩展。相反,我建议localeconv()
和int_curr_symbol
的struct lconv
字段。这是POSIX规范中的字段:
适用于当前区域设置的国际货币符号。前三个字符包含符合ISO 4217:1995标准规定的字母国际货币符号。第四个字符(紧跟在空字节之前)是用于将国际货币符号与货币数量分开的字符。
如你所见,它应该包含你所得到的。
关于你的第二种方法:
此外,nl_langinfo(CRNCYSTR)还返回符号和符号,而只返回所需的符号。”-£" -> "£"
这是因为符号定义符号是放在值的前面还是后面,或者是否应该替换基数字符。这是来自POSIX规范的langinfo.h
:
本币符号,如果符号应出现在值之前,则前面加“-”;如果符号应出现在值之后,则前面加“+”;如果符号应替换基数字符,则前面加“.”。如果本地货币符号是空字符串,则实现可能返回空字符串(“”)。
至于获取字符串部分的方法,我建议在调用之后立即将相关部分从返回值复制到您自己的缓冲区中。您必须这样做,因为结构和函数返回的各种指针都是由C库分配和维护的。
POSIX给出的nl_langinfo()
返回值的原因:
应用程序不应修改返回的字符串。nl\u langinfo()返回的指针可能无效,或者字符串内容可能被随后在任何线程中调用nl\u langinfo()或在同一线程或初始线程中调用nl\u langinfo()所覆盖,也可能被随后调用setlocale()所覆盖,该调用的类别与项的类别(请参阅)或类别LC\u a l l对应,或者通过随后调用uselocale()来更改与项的类别相对应的类别。nl_langinfo_l()返回的指针可能无效,或者字符串内容可能被同一线程中的nl_langinfo_l()或任何线程中的nl_langinfo()的后续调用所覆盖,或者被释放或修改传递给nl_langinfo_l()的locale对象的freelocate()或newlocale()的后续调用所覆盖。
以下是localeconv()
的类似原因:
函数的作用是:返回一个指向填充对象的指针。应用程序不得修改返回值指向的结构,也不得修改结构中指针指向的任何存储区域。返回的指针和结构中的指针可能会失效,或者结构或存储区域可能会被对localeconv()的后续调用覆盖。此外,返回的指针和结构中的指针可能会失效,或者结构或存储区域可能会被随后使用LC_ALL、LC_MONETARY或LC_NUMERIC类别对setlocale()的调用所覆盖,或者被更改LC_MONETARY或LC_NUMERIC类别的uselocale()调用所覆盖。
关于c - nl_langinfo()-太多信息,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19231795/