gpt4 book ai didi

c++ - 当语言环境需要 "3.14"时,如何使用 scanf 解析 "3,14"之类的数字

转载 作者:可可西里 更新时间:2023-11-01 17:37:11 24 4
gpt4 key购买 nike

假设我必须读取一个包含一堆 float 的文件。数字可以像 1e+105-0.15 等,即任何通用 float ,使用小数点 ( 这是固定的!)。但是,我的代码是另一个应用程序的插件,我无法控制当前的语言环境。例如,它可能是俄语,那里的 LC_NUMERIC 规则要求使用十进制 逗号。因此,Pi 应拼写为“3,1415...”,并且

sscanf("3.14", "%f", &x); 

返回“1”,x 包含“3.0”,因为它拒绝解析过去的“.”在字符串中。

对于此类数字解析任务,我需要忽略语言环境。

如何做到这一点?

我可以写一个 parseFloat 函数,但这似乎是一种浪费。
我还可以保存当前的语言环境,将其暂时重置为“C”,读取文件,然后恢复到保存的状态。这对性能有何影响? setlocale() 在某些 OS/libc 组合上会不会非常慢,它到底做了什么?
另一种方法是使用 iostream,但它们的性能同样不是很好。

最佳答案

我个人的偏好是永远不要使用LC_NUMERIC,即只对其他类别调用setlocale,或者在用调用setlocale之后LC_ALL,使用 setlocale(LC_NUMERIC, "C");。否则,如果您想使用标准库以标准形式打印或解析数字以进行交换,您就完全不走运了。

如果您有幸使用符合 POSIX 2008 标准的系统,您可以使用 uselocale*_l 系列函数来改善这种情况。至少有两种基本方法:

  1. 保留默认语言环境未设置(至少像 LC_NUMERICLC_CTYPE 这样麻烦的部分应该始终设置),并且仅当您希望以符合用户自己的文化期望的方式向用户呈现内容时,才将用户区域设置的 locale_t 对象传递给适当的 *_l 函数;否则使用默认的 C 语言环境。

  2. 让需要处理数据以进行交换的代码保留 C 语言环境的 locale_t 对象,并在以下情况下使用 uselocale 来回切换您需要以标准形式处理数据以进行交换,或使用适当的 *_l 函数(但没有 scanf_l)。

请注意,实现您自己的浮点解析器并不容易并且可能不是解决问题的正确方法,除非您是数值计算方面的专家。做到正确非常困难。


POSIX.1-2008 指定 isalnum_l()、isalpha_l()、isblank_l()、iscntrl_l()、isdigit_l()、isgraph_l()、islower_l()、isprint_l()、ispunct_l()、isspace_l()、isupper_l (), 和 isxdigit_l()。

关于c++ - 当语言环境需要 "3.14"时,如何使用 scanf 解析 "3,14"之类的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13919817/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com