【问题标题】:How to convert ascii number to uint64 in C?如何在 C 中将 ascii 数字转换为 uint64?
【发布时间】:2014-10-20 13:47:24
【问题描述】:

我正在使用Mini Ini 从嵌入式系统上的 .ini 文件中读取数据。它支持读取长整数或字符串。我拥有的一些数字太大而无法放入很长的时间,所以我将它们作为字符串读取。但是,我需要将它们转换为 uint64_t。

我尝试使用atof 将其转换为浮点数并将其强制转换为 uint64_t,它崩溃并烧毁,大概是因为强制转换改变了程序查看位的方式而不改变位本身。

char string_in[100];
//ret = ini_gets(section,key,"default_value",string_in,100,inifile);
//To simplify, use 
string_in = "5100200300";
uint64_t value = (uint64_t)atof(string_in);

对于如何将字符串转换为 uint64 的帮助,我将不胜感激。

编辑:结论

atoll 函数将 ascii 转换为 long long,这可以达到我需要的目的。但是,为了完整起见,我实现了接受的答案中提供的功能,并为我的问题提供了确切的答案。

【问题讨论】:

  • float 对于 uint64_t 来说不够大...(顺便说一句,转换会执行截断,但它适用于这种显式转换)。
  • atoll() 是我所需要的。谢谢,我觉得我很愚蠢,但是谷歌背叛了我,所以......
  • strtoull() 提供比 atoll 更多的错误检查。

标签: c ascii uint64


【解决方案1】:

您可以编写自己的转换函数:

uint64_t convert(const char *text)
{
    uint64_t number=0;

    for(; *text; text++)
    {
        char digit=*text-'0';           
        number=(number*10)+digit;
    }

    return number;
}

【讨论】:

  • 感谢您的回答,看起来它会起作用(正如@shuttle87 的建议),但环礁就足够了。不过,我可能会尝试其中一个来取乐
  • 为什么选择使用 const char * 而不是 char *?
  • @Trogdor 显然是因为函数没有改变text?此类指针参数应始终const
  • @Trogdor 注意atoll(const char *nptr) 也需要const
  • @Trogdor 这被称为 const 正确性,被认为是良好的编程风格。它是一种自我记录的代码形式,告诉读者“放心,这个函数不会修改你作为参数传递的东西”。而且它还可以防止函数的程序员不小心用所述参数做愚蠢的事情。
【解决方案2】:
#include <stdint.h>
#include <stdlib.h>
#include <assert.h>

static_assert(sizeof(uint64_t) == sizeof(long long), 
              "Your system is mighty weird");

uint64_t u64 = strtoull(string, NULL, 10);

【讨论】:

    猜你喜欢
    • 2011-10-03
    • 2017-06-06
    • 2011-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-04
    • 1970-01-01
    相关资源
    最近更新 更多