STM32 C:atoi转换字符串中不是参数的部分
我已经从GPS接收器中解析了一些日期和时间。并且需要将它们从字符串转换为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
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)
造成问题。建议不要尝试将字符串大小定义为4或5。
让编译器确定字符串大小
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年”代码>