2016-10-27 46 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); 
    

    或交替:

你可以用这个实现自己的目标。这两种方法都可能产生相同的机器码。