函数nl_langinfo(INT_CURR_SYMBOL)返回指向以下格式的字符串常量的指针:
$(THREE-LETTER-PSEUDOACRONYM) $(SIGN)$(SYMBOL)因此,在我的地区(en_GB.UTF-8),这将是"GBP -£"。我只想要前三个字母,那么除了将nul字符分配给第三个元素或使用strncpy()之外,还有其他方法可以做到这一点吗?
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"此外,nl_langinfo(CRNCYSTR)还返回符号和符号,而只返回所需的符号。"-£" -> "£"
发布于 2013-12-09 23:11:29
INT_CURR_SYMBOL似乎是一个GNU扩展。相反,我建议使用localeconv()和struct lconv的int_curr_symbol字段。这是POSIX关于该领域的规范:
适用于当前地区的国际货币符号。前三个字符包含按照ISO 4217:1995标准中规定的字母顺序的国际货币符号。第四个字符(空字节之前)是用于将国际货币符号与货币数量分开的字符。
正如你所看到的,它应该包含你得到的东西。
关于你的第二种方法:
此外,nl_langinfo(CRNCYSTR)也返回符号和符号,而只返回所需的符号。"-£“-> "£”
这是因为符号定义符号是放在值(+)、值(-)之后,还是应该替换基字符(.)。这是来自langinfo.h的POSIX规范
本地货币符号,前面有'-‘如果符号应该出现在值前面,'+’如果应该出现在值后面,或者‘’。如果符号应该替换基字符。如果本地货币符号是空字符串,则实现可以返回空字符串( "“)。
至于获取字符串部分的方法,我建议在调用后立即将返回值中的相关部分复制到您自己的缓冲区中。您必须这样做,因为任何一个函数返回的结构和各种指针都是由C库分配和维护的。
POSIX给出的nl_langinfo()返回值的原因如下:
应用程序不应修改返回的字符串。nl_langinfo()返回的指针可能无效,或者字符串内容可能被任何线程中的nl_langinfo()或同一线程或初始线程中的nl_langinfo_l()的后续调用所覆盖,随后调用setlocale()和与项目类别(参见)或类别LC_ALL相对应的类别,或者随后调用uselocale(),这些调用更改了与项目类别相对应的类别。nl_langinfo_l()返回的指针可能无效,或者字符串内容可能被后续调用相同线程中的nl_langinfo_l()或任何线程中的nl_langinfo()覆盖,或者被随后调用freelocale()或newlocale()覆盖,这些调用释放或修改传递给nl_langinfo_l()的locale对象。
下面是localeconv()的类似理由
函数将返回一个指向填充对象的指针。应用程序不应修改返回值所指向的结构,也不应修改结构内指针指向的任何存储区域。返回的指针和结构中的指针可能无效,或者结构或存储区域可能被后续调用localeconv()覆盖。此外,返回的指针和结构中的指针可能无效,或者结构或存储区域可能被随后调用setlocale()和类别LC_ALL、LC_MONETARY或LC_NUMERIC覆盖,或者通过调用uselocale()来更改类别LC_MONETARY或LC_NUMERIC。
https://stackoverflow.com/questions/19231795
复制相似问题