2017-06-22 291 views
0

我想在Keil中使用sprintf();函数。但我有恼人的警告。让我用下面的示例代码部分来解释我的警告。当我调试时,我得到;Keil中sprintf令人讨厌的警告

警告:#167-d:类型的参数 “uint8_t *” 是类型的参数不兼容 “的char *限制”

它提醒我关于格式类型的线。

我知道sprintf函数不是一个好的解决方案,但我真的很想知道为什么这个警告炫耀?

感谢

#include "stm32l0xx.h" // Device header 
#include <stdio.h> 

void LCD_show(uint32_t s_value) 

{ 

    uint8_t str[9], i; 

    for (i = 0; i < 9 ; i++) str[i] = 0; 

    sprintf(str, "%9ld", s_value); 

} 
+0

什么是's_value'?它不在您提供的代码中。 –

+0

对不起,s_deger和s_value之间的区别是相同的,我只是在做拷贝时犯了错误。只是改变了。 –

+0

'uint8_t str [9],i;'>'char str [9],i;'。或者使用cast:'sprintf((char *)str,“%9ld”,s_value);' –

回答

1

修复你的警告:

你有两个选择:要么宣布strchar,或使用类型转换:

sprintf((char *) str, "%9ld", s_value); 

优化您的代码:

的唯一原因你有一个循环是用零初始化str数组。以下是确实,在一个简单的,可读的方式,无需代码开销代码:

char str[9] = {0}; 

修复代码:

从文件摘录:

格式说明如下这原型:
%[flags] [width] [。precision] [length]说明符
...
宽度:
最小要打印的字符数。如果要打印的值小于此数字,则结果将填充空白。即使结果较大,该值也不会被截断。

这意味着你的代码最终会得到缓冲区溢出并会崩溃。使用snprintf

+0

代码还具有UB,它具有不匹配的'%ld'说明符和'uint32_t'参数。 –

+0

'%ld'代表'long int',但'uint32_t'很可能是'unsigned int'的typedef。我不完全确定你会在这种特殊情况下得到警告(可能取决于编译器,也不确定),因为'long int'比'unsigned int'要大,你不会丢失任何数据。 –

+0

但是,在这种情况下,正确的格式说明符应该只是'%u'。 –

0

uint8_tchar不一定是一回事。通常实际上它的类型定义为unsigned char