我需要将一个大字符号转换成一个长字符,以便在AtmelStudio上编程我的AtmelStudio芯片。
我试过使用atol()和strtoul(),但它不起作用。我在谷歌上读到,strtoul()有一个错误,它只允许使用较小的值。我试过了,这是真的。我可以用strtoul()将字符"250“转换为long,但不能将其转换为"5555”。
我已经读到过,修复是创建您自己的strtoul()函数,但是如何做到这一点呢?我不知道strtoul()的实现,它是库中的一个外挂。
这样做是行不通的:
char *my_time = "2505";
unsigned long new2 = (unsigned)strtoul(my_time, NULL, 10);发布于 2015-02-19 16:22:55
将(无符号)十进制字符串转换为整数的核心是:
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位微控制器,如果您的应用程序仅限于65,536以下的整数,那么您可能可以通过将自己限制为uint16_t而不是unsigned long来获得大量的代码空间。
发布于 2015-02-19 16:21:36
请运行这个测试程序并告诉我们它打印了什么。如果你没有printf,想办法让我们得到和这个程序打印的相同的信息。(如果您没有errno,那么这个部分就没有其他部分那么重要了。)
#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;
}发布于 2015-02-19 16:28:19
很容易将表示机器unsigned long类型范围内的数字的十进制字符串转换为unsigned long值。例如:
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;
}如果您想要额外的特性(例如选择基数)或对非数字或超长输入的不同行为,那么可以在这种基本方法的基础上实现这些功能。
https://stackoverflow.com/questions/28611259
复制相似问题