Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
AtmelStudio中大值的C strtoul()错误_C_Type Conversion_Avr_Atmega - Fatal编程技术网

AtmelStudio中大值的C strtoul()错误

AtmelStudio中大值的C strtoul()错误,c,type-conversion,avr,atmega,C,Type Conversion,Avr,Atmega,我需要将一个大字符数转换为一个长字符数,以便在AtmelStudio上编程我的Atmega8芯片 我试过使用atol()和strtoul(),但它不起作用。我在谷歌上读到过一个关于strtoul()的bug,它只允许使用较小的值。我试过了,这是真的。我可以使用strtoul()将字符“250”转换为长字符,但不能使用“5555” 我已经读到修复方法是创建自己的strtoul()函数,但是我该如何做呢?我不知道strtool()的实现,它是库中的一个外部程序 这不起作用: char *my_tim

我需要将一个大字符数转换为一个长字符数,以便在AtmelStudio上编程我的Atmega8芯片

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

我已经读到修复方法是创建自己的strtoul()函数,但是我该如何做呢?我不知道strtool()的实现,它是库中的一个外部程序

这不起作用:

char *my_time = "2505";      
unsigned long new2 = (unsigned)strtoul(my_time, NULL, 10);

请运行此测试程序并告诉我们它打印的内容。如果您没有
printf
,请找出一些方法让我们获得该程序打印的相同信息。(如果您没有
errno
,则该部分不如其余部分重要。)

#包括
#包括
#包括
#包括
内部主(空)
{
const char*my_time=“2505”;
char*endptr;
无符号长值;
errno=0;
值=strtoul(我的时间,&endptr,10);
printf(“值=%lu endptr=%s增量=%ld错误号=%d(%s)\n”,
值,endptr,(long)(endptr-我的时间),
厄尔诺,斯特雷罗(厄尔诺));
返回0;
}
将(无符号)十进制字符串转换为整数的核心是:

unsigned long str2int(const char *s)
{
  unsigned long x = 0;
  while(isdigit(*s))
  {
    x *= 10;
    x += *s++ - '0';
  }
  return x;
}
这真的不是很复杂,它只是在数字之间穿行,在前进的过程中积累价值。
*s++-'0'
也许是我无法控制“有经验的C程序员的最大简洁综合症”的一个迹象。我也有点匆忙。更明确的方法可能是:

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位微控制器,您可以将自己限制为
uint16\t
,而不是
无符号长
,从而获得大量的代码空间,如果您的应用程序仅限于65536以下的整数。

将表示机器
无符号长
类型范围内的数字的十进制数字字符串转换为
无符号长
值非常容易。例如:

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;
常量字符*c=数字;

虽然('0'@JoachimPileborg,我不知道,我在做嵌入式编程,但我没有printf。从我看到的情况来看,它似乎返回0。那么问题是什么呢?那么澄清一下,你是说这些函数在你的C库实现中有缺陷,是吗?“我在谷歌上读到有一个缺陷……”您肯定没有在google上读到这篇文章,而是在google链接的页面上读到的。这是哪些页面?但是,如果您使用的实现中存在错误,您现在就知道为什么它不能使用您的实现了。1)您需要检测转换溢出吗?2)删除
(未签名)
强制转换
(未签名)strtoul(my_time,NULL,10)
如果
无符号
是非常规的8位,则它没有任何作用,可能是您的问题。错误6未定义对“strerror”的引用我认为我无法“打印”在AtmelStudio上。它是嵌入式程序如果你没有strerror,就把那部分拿出来。我不明白-0是嵌入式空间中一个问题的明智答案!@ConradC它将数字(一个字符)转换成一个小整数。
'0'
是数字(字符、字形、符号)它表示整数
0
,因此通过从已知的数字字符中减去
'0'
,我们可以得到它的整数表示形式。C保证数字字符的编码方式能够实现这一点。
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;
}