1

该函数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), 还返回符号和符号,而只需要符号。"-£"->"£"

4

1 回答 1

1

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_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() 覆盖。此外,返回的指针和结构中的指针可能会失效,或者结构或存储区域可能会被后续使用类别 LC_ALL、LC_MONETARY 或 LC_NUMERIC 调用 setlocale() 或调用 uselocale() 覆盖这会更改类别 LC_MONETARY 或 LC_NUMERIC。

于 2013-12-09T23:11:29.853 回答