Функция String type replace не может заменить ни один символ

Я хочу заменить ":"(двоеточие) в MAC - адресе без символа (удалить ":").

Но я не могу найти никакого хорошего решения.

String.replace(), не может заменить на (void).

Примечание: String.replace(':',(char)0) //также не работает

String.remove() уродлив и требует, чтобы вы точно знали, где находится каждая итерация (indexOf ()), и этот метод ничего не возвращает, он обновляет строку напрямую, поэтому вам нужно вызывать : String.remove() для каждого вхождения.

и String.substring() имеет большинство тех же проблем, что и remove, за исключением того, что он возвращает подстроку, так что вы можете сделать: String.substring(i,l).substring(i2,l)...

#include <WiFi.h>
String MAC;
char ssid[] = "WiFi SSID"
char psw[] = "WiFi PSW"
void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  WiFi.begin(ssid,psw);
  MAC = WiFi.macAddress();
}

void loop() {
  // put your main code here, to run repeatedly:

  Serial.println("MAC Address unformatted")
  Serial.println(MAC);
  String MAC_f = MAC.replace(':', ' ');
  // Now print the MAC without the ":"
  Serial.println(MAC_f);
  // This replaces the ':' with a space.  I want to replace(remove) the ':' with no char
  // Looking for an elegant, simple, 1 liner to accomplish this.
  
  /* This looks horrible */
  MAC_f = MAC.substring(0,2)+MAC.substring(3, 5)+MAC.substring(6, 8)+MAC.substring(9, 11)+MAC.substring(12, 14)+MAC.substring(15, 17);
  /* .remove also looks terrible */
  MAC_f = MAC;
  MAC_f.remove(2,1);
  MAC_f.remove(2,1);
  // ...
  
}

, 👍0

Обсуждение

Пожалуйста, не пытайтесь отвечать на вопросы в комментариях. См. [Как работают комментарии?](https://meta.stackexchange.com/questions/19756/how-do-comments-work). Комментарии по этому вопросу были удалены, в том числе и о "специальном сообщении". В связи с этим посланием были приняты соответствующие меры., @Nick Gammon


3 ответа


3

Не используйте манипуляции String() внутри loop(). Это приводит к фрагментации кучи и сбою программы. Вместо этого используйте массив char:

char MAC[18] = "01:23:45:67:89:AB"; // including terminating zero

for (int src = 0, dst = 0; src < sizeof(MAC); src++)
   if (MAC[src] != ':') MAC[dst++] = MAC[src];
,

Это работает, потому что завершающий ноль копируется в конец измененной строки, @SBF

@Подстрекатель в каком смысле это неэффективно? Вы знаете, что делает String.replace ()?, @Sim Son


3

Как заявил Mat, пустая строка в C++ - это "". Это работает:

MAC_f = MAC;
MAC_f.replace(":", "");

Тем не менее, я согласен с ответом SBF: String object не дружит с памятью Arduino. Решение SBF лучше, чем String::replace().

,

@Подстрекатель вы знаете разницу между x" и"x", верно. String.replace()` принимает аргументы **String**, а не char, как вы написали. https://www.arduino.cc/reference/en/language/variables/data-types/string/functions/replace/, @Sim Son


0

другие правы, что String не полностью подходит для Arduino, WiFi.MacAddress() возвращает String, ТАК ЧТО

хотя я написан для ESP32, это подход, который я использовал

 // Получить MAC - адрес интерфейса станции.
 // @return String MAC, без camas
String getMacAddress(void)
{
    WiFi.mode(WIFI_AP_STA);   // требуется прочитать NVR перед WiFi.begin()
    uint8_t baseMac[6];
    esp_read_mac( baseMac, ESP_MAC_WIFI_STA );  // Получить MAC-адрес для WiFi-станции
    char macStr[18] = { 0 };
    sprintf(macStr, "%02X%02X%02X%02X%02X%02X", baseMac[0], baseMac[1], baseMac[2], baseMac[3], baseMac[4], baseMac[5]);
    return String(macStr);
}
// END getMacAddress() 
,

возможно, именно так это и должно быть сделано, но это не отвечает на вопрос, @Juraj

Вы говорите о WiFi.MacAddress (), но вы используете esp_read_mac() с массивом char?, @SBF