Неверное преобразование из 'const char*' в 'char*' [-fpermissive]

С помощью WebSocket приходят различные сообщения.

Задача:

  1. Найти сообщение "setBrightness: 15"
  2. Извлеките значение "15" из сообщения (значение может быть любым)
  3. Преобразуйте это значение в uint8_t

Мой код:

#include <string.h>

String payload_str = "setBrightness: 15"; // Сообщение веб-сокета
const char* payload = payload_str.c_str(); // Преобразование строки в символ

const char* value; // Значение сообщения
uint8_t brightness;

void setup() {
  Serial.begin(9600);

  if(strncmp(payload, "setBri", 6) == 0) { // Поиск сообщения
   value = strtok(payload, " ");
   value = strtok(NULL," "); // Получить значение (15)
   brightness = (uint8_t)atoi(value); // Преобразование в uint8_t
  }
}

void loop() {}

Ошибка компиляции:

ошибка: неверное преобразование из 'const char*' в 'char*' [-fpermissive]

ошибка: инициализация аргумента 1 для 'char* strtok(char*, const char*)' [-fpermissive]

Возможно, я делаю это совершенно неправильно и небезопасно. Как это можно исправить?

, 👍0


1 ответ


Лучший ответ:

1

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

Для теста вы можете инициализировать массив символов, как показано в следующем примере.

char payload[] = "setBrightness: 15";

uint8_t brightness;

void setup() {
  Serial.begin(9600);

  if(strncmp(payload, "setBri", 6) == 0) { // Поиск сообщения
   strtok(payload, " ");
   const char* tok = strtok(NULL," "); // Получить значение (15)
   brightness = (uint8_t) atoi(tok); // Преобразование в uint8_t
  }
}

void loop() {}

если вы знаете часть "имя" в строке имя:значение, вы можете пропустить ее для atoi следующим образом:

brightness = (uint8_t) atoi(payload + strlen("setBrightness: "));

(strlen("setBrightness: " будет оцениваться во время компиляции как постоянное число)

const char payload[] = "setBrightness: 15";

uint8_t brightness;

void setup() {
  Serial.begin(9600);

  if(strncmp(payload, "setBri", 6) == 0) { // Поиск сообщения
     brightness = (uint8_t) atoi(payload + strlen("setBrightness: ")); // Преобразование в uint8_t
  }
}

void loop() {}
,

Спасибо за помощь! Сегодня попробую и скажу результат., @Delta