2013-10-07 22 views
1

nl_langinfo(INT_CURR_SYMBOL)返回一个指向字符串常量,它是格式的功能:了nl_langinfo() - 太多的信息

$(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),也返回符号和符号,而在仅需要符号。 "-£" - >"£"

回答

1

INT_CURR_SYMBOL似乎是一个GNU扩展。相反,我建议localeconv()struct lconvint_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()的语言环境对象。

,这里是类似原因localeconv()给出:

的localeconv()函数将返回一个指向已填写的对象。应用程序不应修改返回值指向的结构,也不应修改结构内指针所指向的任何存储区域。返回的指针和结构中的指针可能会失效,或者随后调用localeconv()可能会覆盖结构或存储区域。另外,返回的指针和结构中的指针可能会失效,或者结构或存储区域可能会被后续对setlocale()调用LC_ALL,LC_MONETARY或LC_NUMERIC类别或调用uselocale()所覆盖。其中改变类别LC_MONETARY或LC_NUMERIC。

+0

谢谢,我意识到标志的重要性,但当时我对订单不感兴趣。作为最好的(也是唯一的)答案,您将获得接受的答案:) –