一、解除sscanf编译器数据类型不匹配警告
sscanf使用中,当输入字符串的类型与sscanf字符串参数不匹配时,会出现编译器警告,或者不能获取到数据,导致单片机死机。
如:
int32_t x;
uint8_t str[20] = "123456";
sscanf(str, "%d", &x);
编译器会报警告:
warning: passing 'uint8_t *' (aka 'unsigned char *') to parameter of type 'const char *' converts between pointers to integer types where one is of the unique plain 'char' type and the other is not [-Wpointer-sign]
查阅sscanf的函数原型后:
int sscanf(const char *buffer,const char *format,[argument ]...);
对字符串str进行强制类型转换后,警告解除,函数功能正常。
sscanf((const char *)str, "%d", &x);
二、使用sscanf和sprintf做字符串与数据之间进行互转
在字符串与数据之间进行互转时,可以使用sscanf和sprintf。
函数sscanf:字符串转化为数据
函数sprintf:数据转化为字符串
注意:sscanf和scanf的区别:scanf是以键盘作为输入源,sscanf是以字符串作为输入源。
下面以整数与字符串互转为例说明:
sscanf是将字符串转化为整数。格式:
sscanf(字符串的名字,"%d",整型变量的名字);
sprintf是将整数转化为字符串。格式:
sprintf(字符串的名字,"%d",整型变量的名字);
三、函数说明
sscanf原型:
int sscanf(const char *str,const char *format,[argument ]...);
功 能: 执行从字符串中的格式化输入
参数: str 要输入的字符串
format是格式控制字符串
[,argument,...] 是选择性设定字符串。
实现原理:sscanf会从buffer中读入数据,然后按照format的格式将数据赋给argument
sprintf原型:
int sprintf(char *str, char *farmat [,argument,...]);
功 能: 格式化输出到字符串中
参数: char *str 要输出的字符串
char *farmat [,argument,...] 要输入的格式
返回值: 返回字符串的字节数
四、关于void指针
在使用指针时,不同数据类型的参数传递也会让编译器出现警告或直接报错,遇到这种情况时可以试一下void * 指针,也许问题就迎刃而解。此处仅作记录。有时间再对此问题重新发文。