Строковое присвоение 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,"
,