【问题标题】:Reading ASCII numbers using "D" instead of "E" for scientific notation using C使用“D”而不是“E”读取 ASCII 数字以使用 C 进行科学记数法
【发布时间】:2010-03-31 17:30:59
【问题描述】:

我有一个如下所示的数字列表:1.234D+11.234D-02。我想使用 C 读取文件。函数atof 只会忽略D 并只翻译尾数。

函数fscanf 将不接受'%10.6e' 格式,因为它需要在指数中使用E 而不是D

当我在 Python 中遇到这个问题时,我放弃了,只是在将字符串转换为浮点数之前使用了字符串替换。 但在 C 语言中,我相信一定有另一种方式

那么,您将如何使用D 而不是E 作为科学记数法来读取带有数字的文件?请注意,我不是指如何读取字符串本身,而是如何将它们转换为浮点数。

谢谢。

【问题讨论】:

    标签: c string scanf scientific-notation atof


    【解决方案1】:

    您可以利用strtodstrtok

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main(void) {
        char in[] = "1.234D+1 ABCD 1.234D-02 5\n";
        char *cursor;
        char *endp;
        for ( cursor = strtok(in, " "); cursor; cursor = strtok(NULL, " ")) {
            double d = strtod(cursor, &endp);
            if ( *endp == 'D' ) {
                *endp = 'e';
                d = strtod(cursor, &endp);
            }
            if ( endp != cursor ) {
                printf("%e\n", d);
            }
        }
        return 0;
    }
    

    输出:

    E:\> cnv
    1.234000e+001
    1.234000e-002
    5.000000e+000

    【讨论】:

    • 我很失望 C 缺乏对使用 D 而不是 E 读取科学记数法的原生支持。您提出的代码最接近完美的解决方案。谢谢!
    • @Arrieta:我很失望它无法解析出现字母 Q 而不是数字 0(零)的数字。似乎图书馆设计师不明白我们的要求对于这么多程序有多重要...... ;-)
    【解决方案2】:

    通过沿字符串循环将 D 替换为 E。然后atof

    【讨论】:

      【解决方案3】:

      这里这个功能就是用“D”把科学计数法中的“D”换成“E”。

      std::string dToE(string cppstr)
      {
          str1.replace(cppstr.find("D"),1,"E");
          return cppstr;
      }
      

      如果科学计数法的 C 字符串定义为: 字符 * cstr = "1.2D+03"; 或者通常通过strtok方法获得,返回C字符串,然后使用atof(dToE(string(cstr)).c_str())获取带“E”的科学计数法。

      由于atof只接受C风格的字符串,你应该使用c_str()字符串方法将C++字符串转换成C字符串。

      【讨论】:

        猜你喜欢
        • 2010-12-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-23
        • 1970-01-01
        相关资源
        最近更新 更多