AtmelStudio中大值的C strtoul()错误
我需要将一个大字符数转换为一个长字符数,以便在AtmelStudio上编程我的Atmega8芯片 我试过使用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
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;
}