STM32 C:atoi转换不是参数的字符串的一部分

时间:2014-01-24 13:13:38

标签: c embedded stm32 atoi

我已经从GPS接收器解析了一些日期和时间。并且需要将它们从字符串转换为int

char year[4] = "2014";
char month[2] = "01";
char day[2] = "24";
char hour[2] ="12";
char minute[2] = "58";
char second[2] = "39";

GPS_current_year = atoi(year);
GPS_current_month = atoi(month);
GPS_current_day = atoi(day);
GPS_current_hour = atoi(hour);
GPS_current_minute = atoi(minute);
GPS_current_second = atoi(second);

执行这些后,结果为:

enter image description here

转换小时字符串时,转换分钟字符串的一部分。与分钟和秒相同。

字符串并排放置在内存中。

如果我更改定义字符串的顺序,则可以将秒添加到年等等。

问题:

  • 可能导致此错误的原因是什么?
  • 使用atoi
  • 有什么方法可以避免此错误

我知道我可以一次使用循环char进行转换。只是试图找出它为什么不起作用。

4 个答案:

答案 0 :(得分:3)

除了字符串周围缺少引号外,您的char数组的大小应该被定义为在EOS中保留一个char(字符串的结尾为二进制零)。

由于存储器表示将是例如“2014 \ 0”

char year[4+1] = "2014";

答案 1 :(得分:3)

建议不要将字符串大小定义为4 5 让编译器确定字符串大小。

char year[] = "2014";

在这种情况下,编译器将使用year'2''0''1',{{1}初始化大小为5的'4' }}

OP将大小定义为4导致4-char数组的大小没有终止'\0',这不是字符串,会导致'\0'出现问题。

答案 2 :(得分:0)

你忘记了字符串中的引号:

char year[4] = "2014";

答案 3 :(得分:0)

atoi()将字符串转换为整数。但是您为字符串变量提供了非字符串值。将您的代码更改为

char year[5] = "2014";
char month[3] = "01";
char day[3] = "24";
char hour[3] ="12";
char minute[3] = "58";
char second[3] = "39";