2016-10-27 47 views
-1

我想分配字符串到uint8_t緩衝區在IAR,但我收到一條警告消息。字符串分配到uint8_t在c

rx_buffer.rx_struct.RESP.RESPONDstruct fielduint8_t類型。

我的代碼是:

strncpy(rx_buffer.rx_struct.RESP.RESPOND, (uint8_t *)'NS,', 3);

和相關的警告信息如下:

Warning[Pe1422]: multicharacter character literal (potential portability problem) 
Warning[Pe167]: argument of type "uint8_t *" is incompatible with parameter of type "char *", 
Warning[Pe167]: argument of type "uint8_t *" is incompatible with parameter of type "char const" 

我寫了一個解決辦法:

rx_buffer.rx_struct.RESP.RESPOND[0] = 'N'; 
rx_buffer.rx_struct.RESP.RESPOND[1] = 'S'; 
rx_buffer.rx_struct.RESP.RESPOND[2] = ','; 

但我不滿意它。什麼是正確的方法來做到這一點?

+0

使用雙引號,使字符串 –

回答

1

您正在使用單引號,但你需要雙引號("NS,"),看一看,以Stop using strncpy already!,在這種情況下,應該按預期工作,因爲你不希望尾隨'\0'做,但不使用它。

使用memcpymemmove,還(作爲一個風格問題),不要使用幻數像3

#include <stdio.h> 
#include <string.h> 
#include <stdint.h> 

#define MAX_SIZE 3 

int main(void) 
{ 
    uint8_t arr[MAX_SIZE]; 

    memmove(arr, "NS,", MAX_SIZE); 
    for (int i = 0; i < MAX_SIZE; i++) { 
     printf("%c", arr[i]); 
    } 
    printf("\n"); 
    return 0; 
} 
0

strncpy預計其前兩個參數分別爲char *const char *。如果有的話,而不是鑄造到unit8_t *,你應該鑄造到char *

另外,'NS,'是字符文字,字符串文字應該是"NS,"

3

您的代碼不正確,在許多方面:

strncpy(rx_buffer.rx_struct.RESP.RESPOND, (uint8_t *)'NS,',3); 
  • 目標數組沒有類型char *
  • 源不是一個數組:'NS,'是一個多字符字符常量,非便攜式歷史奇怪的是,沒有人會使用任何體面的代碼...鑄造到(uint8_t *)不能解決這個問題。你應該使用雙引號:"NS,"
  • strncpy()不適合這份工作。事實上,它絕對不是任何工作的正確工具。這個函數不是strcpy的安全替代品,它的語義被廣泛誤解,它非常容易出錯。你應該避免使用這個功能。在這種特殊情況下,它會按預期複製3個字節,但爲什麼在memcpy()是更簡單的解決方案時使用strncpy()?通過單獨的分配每個字節張貼在這個問題

    memcpy(rx_buffer.rx_struct.RESP.RESPOND, "NS,", 3); 
    

    或交替:

你可以用這個實現自己的目標。這兩種方法都可能產生相同的機器碼。