Функция 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);
// ...
}
@Instigator, 👍0
Обсуждение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
Как заявил 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
другие правы, что 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
- Как разделить входящую строку?
- Как вывести несколько переменных в строке?
- форматирование строк в Arduino для вывода
- Очень простая операция Arduino Uno Serial.readString()
- DateTime в строку
- Как преобразовать строку в массив байтов
- Как отправить строку на мастер с помощью i2c
- Создание форматированной строки (включая числа с плавающей запятой) в Arduino-совместимом C++
Пожалуйста, не пытайтесь отвечать на вопросы в комментариях. См. [Как работают комментарии?](https://meta.stackexchange.com/questions/19756/how-do-comments-work). Комментарии по этому вопросу были удалены, в том числе и о "специальном сообщении". В связи с этим посланием были приняты соответствующие меры., @Nick Gammon