2017-06-22 149 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