Строковое присвоение uint8_t в c

Я пытаюсь присвоить строку uint8_t буфер в IAR, но я получаю предупреждение.

rx_buffer.rx_struct.RESP.RESPOND является struct field из uint8_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] = ',';

Но я не доволен этим. Как правильно это сделать?

3 ответа

Решение

Вы используете одинарные кавычки, но вам нужны двойные кавычки ("NS,"), и посмотрите, чтобы прекратить использование strncpy уже! в этом случае он должен работать как положено, потому что вы не хотите трейлинг '\0', но не используйте его.

использование memcpy или же memmoveтакже (как вопрос стиля) не используйте магические числа, такие как 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;
}

Ваш код неверен во многих отношениях:

strncpy(rx_buffer.rx_struct.RESP.RESPOND, (uint8_t *)'NS,',3);
  • Массив назначения не имеет типа char *
  • источник не является массивом: 'NS,' символьная константа, состоящая из нескольких символов, непереносимая историческая странность, которую никто не использовал бы в любом приличном коде... приведение к (uint8_t *) не решает эту проблему. Вы должны просто использовать двойные кавычки: "NS,",
  • strncpy() не является подходящим инструментом для этой работы. На самом деле это никогда не правильный инструмент для любой работы. Эта функция не является безопасной заменой strcpyЭто семантика широко неправильно, это очень подвержен ошибкам. Вы должны избегать использования этой функции. В данном конкретном случае он просто скопирует 3 байта, как и ожидалось, но зачем использовать strncpy() когда memcpy() это более простое решение?

Вы можете достичь своей цели с помощью этого:

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

или поочередно, присваивая каждый байт отдельно, как указано в вопросе. Оба подхода могут генерировать один и тот же машинный код.

strncpy ожидает, что его первые два аргумента будут иметь тип char * а также const char *соответственно. Вместо того, чтобы навести на unit8_t *, вы должны кастинг на char *, если вообще.

Также, 'NS,' символьный литерал, строковый литерал будет "NS,",

Другие вопросы по тегам