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

STM32 C:atoi转换字符串中不是参数的部分,c,embedded,stm32,atoi,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_d

我已经从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);
执行这些步骤后,结果如下:

在转换小时字符串时,分钟字符串的一部分以某种方式被转换。分钟和秒也一样

字符串并排放置在内存中

如果我更改了定义字符串的顺序,那么秒可能会添加到年等

问题:

  • 什么可能导致此错误
  • 使用
    atoi
    有没有办法避免此错误

我知道我可以使用循环一次转换一个
char
。只是想找出它不起作用的原因。

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

char year[4] = "2014";

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

char year[4] = "2014";
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";
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";

除了字符串周围缺少引号外,还应定义字符数组的大小,以便在EOS中再保留一个字符(字符串末尾为二进制零)

因为内存表示将是例如“2014\0”


除了字符串周围缺少引号外,还应定义字符数组的大小,以便在EOS中再保留一个字符(字符串末尾为二进制零)

因为内存表示将是例如“2014\0”


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

char year[] = "2014";
在这种情况下,编译器将使用
'2'
'0'
'1'
'4'
'\0'
初始化
使
年份的大小为5


OP将大小定义为4导致大小为4个字符的数组,而没有终止的
'\0'
,这不是一个字符串,会给
atoi(year)

造成问题。建议不要尝试将字符串大小定义为45。
让编译器确定字符串大小

char year[] = "2014";
在这种情况下,编译器将使用
'2'
'0'
'1'
'4'
'\0'
初始化
使
年份的大小为5


OP将大小定义为4导致大小为4个字符的数组,而没有终止的
'\0'
,这不是字符串,会给
atoi(year)

带来问题。如果这些数组应该是字符串,那么它们太小了,因为您忘记了特殊的字符串终止符字符。通常,对于字符串,您不需要指定大小,如果指定,则它们必须至少比字符串长度大一个字符。如果这些数组应为字符串,则它们太小,因为您忘记了特殊的字符串终止符字符。通常,对于字符串,您不需要指定大小,如果指定,它们必须至少比字符串长度大一个字符。这!!!多谢各位。定义只是一个例子,在原始代码中并没有这样定义。将在几秒钟内修复我的帖子。更好的方法是:忽略大小,让编译器计算出来:
char year[]=“2014”
——或者,如果不需要修改它,
const char*year=“2014”这个!!!多谢各位。定义只是一个例子,在原始代码中并没有这样定义。将在几秒钟内修复我的帖子。更好的方法是:忽略大小,让编译器计算出来:
char year[]=“2014”
——或者,如果不需要修改它,
const char*year=“2014”将导致编译时错误,而不是OP描述的运行时症状。问题已更新。但是
char year[4]=“2014年”
不会创建字符串,因为没有空间终止
“\0”
。这将导致编译时错误,而不是OP描述的运行时症状。问题已更新。但是
char year[4]=“2014年”
不会创建字符串,因为没有空间终止
“\0”
。这将导致编译时错误,而不是OP描述的运行时症状。问题已更新。但是
char year[4]=“2014年”
不会创建字符串,因为没有空间用于终止
“\0”
。为什么要麻烦指定数组的大小,而不是让编译器来计算呢<代码>字符年[]=“2014年”将导致编译时错误,而不是OP描述的运行时症状。问题已更新。但是
char year[4]=“2014年”
不会创建字符串,因为没有空间用于终止
“\0”
。为什么要麻烦指定数组的大小,而不是让编译器来计算呢<代码>字符年[]=“2014年”