首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于AtmelStudio中大型值的C() bug

用于AtmelStudio中大型值的C() bug
EN

Stack Overflow用户
提问于 2015-02-19 16:13:55
回答 3查看 319关注 0票数 1

我需要将一个大字符号转换成一个长字符,以便在AtmelStudio上编程我的AtmelStudio芯片。

我试过使用atol()strtoul(),但它不起作用。我在谷歌上读到,strtoul()有一个错误,它只允许使用较小的值。我试过了,这是真的。我可以用strtoul()将字符"250“转换为long,但不能将其转换为"5555”。

我已经读到过,修复是创建您自己的strtoul()函数,但是如何做到这一点呢?我不知道strtoul()的实现,它是库中的一个外挂。

这样做是行不通的:

代码语言:javascript
复制
char *my_time = "2505";      
unsigned long new2 = (unsigned)strtoul(my_time, NULL, 10);
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-02-19 16:22:55

将(无符号)十进制字符串转换为整数的核心是:

代码语言:javascript
复制
unsigned long str2int(const char *s)
{
  unsigned long x = 0;
  while(isdigit(*s))
  {
    x *= 10;
    x += *s++ - '0';
  }
  return x;
}

这并不是很复杂,它只是通过数字,建立了它的价值。*s++ - '0'可能是我未能控制我的“经验丰富的C程序员最大简洁综合症”的一个迹象。我还有点着急。一种更明确的办法可能是:

代码语言:javascript
复制
while(isdigit(*s))
{
  x *= 10; /* Each new digit makes the old ones worth more. */
  const int digit = *s - '0'; /* Convert digit character to small int. */
  x += digit; /* Add the current digit. */
  ++s;
}

例如,考虑"432"的输入。它将被计算为类似于(0* 10 + 4) * 10 + 3) * 10 + 2。

由于您正在开发一个8位微控制器,如果您的应用程序仅限于65,536以下的整数,那么您可能可以通过将自己限制为uint16_t而不是unsigned long来获得大量的代码空间。

票数 2
EN

Stack Overflow用户

发布于 2015-02-19 16:21:36

请运行这个测试程序并告诉我们它打印了什么。如果你没有printf,想办法让我们得到和这个程序打印的相同的信息。(如果您没有errno,那么这个部分就没有其他部分那么重要了。)

代码语言:javascript
复制
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>

int main(void)
{
    const char *my_time = "2505";
    char *endptr;
    unsigned long value;

    errno = 0;
    value = strtoul(my_time, &endptr, 10);
    printf("value=%lu endptr=%s delta=%ld errno=%d (%s)\n",
           value, endptr, (long)(endptr - my_time),
           errno, strerror(errno));
    return 0;
}
票数 0
EN

Stack Overflow用户

发布于 2015-02-19 16:28:19

很容易将表示机器unsigned long类型范围内的数字的十进制字符串转换为unsigned long值。例如:

代码语言:javascript
复制
unsigned long my_atoul(const char *digits) {
    unsigned long result = 0;
    const char *c = digits;

    while ('0' <= *c && *c <= '9') {
        result = result * 10 + (*(c++) - '0');
    }

    return result;
}

如果您想要额外的特性(例如选择基数)或对非数字或超长输入的不同行为,那么可以在这种基本方法的基础上实现这些功能。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28611259

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档