代码之家  ›  专栏  ›  技术社区  ›  berkay

atol()、atof()、atoi()函数行为,是否有稳定的方法来从/转换为字符串/整数?

  •  2
  • berkay  · 技术社区  · 16 年前

    在这些日子里,我在玩 atol()、atof()和atoi()。 在一篇博客文章中,我找到了一个教程并应用了:

    以下是我的结果:

    void main()
    {
        char a[10],b[10];
        puts("Enter the value of a");
        gets(a);
        puts("Enter the value of b");
        gets(b);
        printf("%s+%s=%ld and %s-%s=%ld",a,b,(atol(a)+atol(b)),a,b,(atol(a)-atol(b)));
        getch();
    }
    

    atof() 它返回字符串的浮点值, atoi() 返回整数值。

    现在我检查了下面的代码,看看这3个代码之间的区别:

    main()
    {
        char a[]={"2545.965"};
        printf("atol=%ld\t atof=%f\t atoi=%d\t\n",atol(a),atof(a),atoi(a));
    }
    

    输出将是

    atol=2545 atof=2545.965000 atoi=2545
    
    char a[]={“heyyou”};
    

    现在,当您运行程序时,将输出以下内容( 为什么? ,是否有将纯字符串转换为整数的解决方案?)

    atol=0 atof=0 atoi=0
    

    字符串应包含数值。现在将此程序修改为

    char a[]={“007hey”};
    

    本例中的输出(在Red Hat Linux中测试)将

    atol=7 atof=7.000000 atoi=7
    

    所以函数只取了007,而不是剩下的部分( 为什么? )

    现在想想这个

    char a[]={“hey007?};
    

    程序的输出将

    atol=0 atof=0.000000 atoi=0
    

    所以我只想把我的字符串转换成数字,然后再转换成相同的文本。我使用了这些函数,正如你所看到的,我得到了非常有趣的结果。

    为什么会这样?

    是否有其他函数可以从/转换为字符串/整数,反之亦然?

    编辑:

    所以作为一个输入,如果我取一些名字,或者别的什么名字,我会把它们转换成整数/浮点数…然后应用一些其他功能。

    我也很好奇,当我使用你的任何建议时,我是否会采用相同的输出和相同的输入?

    4 回复  |  直到 15 年前
        1
  •  6
  •   Dirk is no longer here    16 年前

    这个问题的高端解决方案,考虑到你还添加了C++标签,就是要使用 Boost lexical_cast .

        2
  •  3
  •   James McNellis    16 年前

    你可以使用 strtol() strtod() atol() atof() 因为它们允许您测试转换是否成功。这个 ato_() 正如您在尝试转换时看到的那样,函数会自动失败 "heyyou" .

        3
  •  3
  •   polygenelubricants    16 年前

    本身没有不一致之处:

    • atoi 解析到 int
    • atof 解析到 float
    • atol 解析到 long
    • 这三个都会分析字符串的前缀,直到它到达末尾,或者是一个无效字符。
      • 字符串的其余部分(如果有)将被忽略

    所以我只想把我的字符串转换成数字,然后再转换成相同的文本

    所以这个数字不一定是字符串的智能解释吗?字符串可以有多长,数字可以有多大?

    字符串可以解码为 byte[] . 这够好吗?

    也许你需要这样的东西 public key cryptography ?

        4
  •  2
  •   caf    16 年前

    似乎您想要在任意字符串和实数之间创建一个双主题映射。

    那不是什么 atol() , atoi() atof() 函数用于将以10为基数表示数字的字符串子集转换为相应的 long , int float 值(如果可能)。

    没有内置函数来创建您所追求的双目标映射,特别是因为您实际上没有指定希望映射如何工作。当然,它 可以用C语言编写这样一个映射函数。最简单的方法就是将字符串视为以255为基数的数字序列(第256个字符的值, '\0' 不能构成C字符串的一部分),其中n个最低有效数字表示字符串的长度(其中n是根据您的要求选择的)。请注意,如果要对任意长度的字符串执行此操作,则需要使用“大整数”库(如gmp或openssl的bignum)-标准C中最长的类型,“long long”不能一对一映射到包含长度超过8个字符的字符串的C字符串集,因为其保证范围仅包括18446744,073709551615唯一值。