Копирование строки в другую строку
В моем коде есть массив строк:
String BitSequence [257];
Каждая строка будет содержать от 23 до 64 символов. В какой-то момент в моем коде я должен использовать команду «myString.remove ()», и я не хочу применять какие-либо изменения к моим исходным строкам. Мне нужно сделать копию и выполнить мои команды в скопированной строке. Я сделал:
MycopyString = BitSequence [1];
но это не работает. Какие трюки мне нужно сделать здесь, чтобы сделать копию?
@Afshin, 👍-1
Обсуждение4 ответа
Лучший ответ:
Не работайте с классом String на Arduino. Что делать?
Используйте массивы символов (что представляет собой отдельная строка внутри). Затем вы работаете с указателями или указателями на указатели. Догадываясь по предоставленным вами фрагментам (какой тип MycopyString?), вы создаете указатель (?) на элемент в массиве.
Работа с классом String имеет два недостатка.
- Вы должны заглянуть в библиотеку, чтобы увидеть, что на самом деле делает функция, и
- резервируя и освобождая память, она разрушается при длительном (в большинстве случаев коротком) выполнении вашей кучи, что приводит к сбою вашего AVR/ESP.
Возможность создания двумерных массивов
i = 257;
char myTwoDimArray [i][64] = {'\0','\0'}// 64 ... 63 chars + 1 terminator(!)
а затем вы оперируете указателями либо на запись (i), либо на сам указанный массив символов.
Как удалить запись Вы только что написали:
i = 23;
myTwoDimArray [i][0] = '\0';
записав нулевой терминатор в первый индекс (начинается с 0) 24-го (!) элемента (опять же индекс начинается с 0), он удаляется.
Команды, на которые следует обращать внимание при работе с символами
strcpy (targetChar, charToAdd); // Инициализирует targetChar, начиная с индекса 0
strcat (targetChar, charToAdd); // Добавляется к targetChar, начиная с текущего индекса
преобразование числовых значений в символы:
char numBuffer [16] = {'\0'}; // Вспомогательный буфер для конверсий
itoa (myNumberValue,numBuffer,10); // преобразует целое число в 10 (десятичный) символ
itoa (myNumberValue,numBuffer,2); // преобразует целое число в двоичный символ с основанием 2
itoa (myNuberValue,numBuffer,16); // преобразует целое число в 16 (шестнадцатеричный) символ
itoa инициализирует массив символов, поэтому нам нужен вспомогательный массив:
strcat (targetChar, numBuffer);
для преобразования float мы используем
dtostrf(floatVariable, StringLengthIncDecimalPoint, numVarsAfterDecimal, numBuffer);
чтобы преобразовать символы обратно в int, используйте
int16_t myIntVar = atoi(numBuffer);
чтобы преобразовать символы обратно в числа с плавающей точкой, используйте
float myFloatVar = atof(numBuffer, decimalsToShow); // используя только atof(numBuffer)
gives you standard x.XX only 2 decimals
Надеемся, что это всеобъемлющее введение в символы поможет вам в ваших текущих и будущих проектах.
Вы когда-нибудь проверяли результат 64 * 257? @Afshin упоминает Arduino Nano. Вы правы: со строками, конечно, намного хуже., @DataFiddler
Да, я проверил, но ОП, вероятно, нет, и символы дадут ему знать ;-) - надеюсь, @Codebreaker007
Удивительное объяснение. Прошла неделя, как я начал программировать Arduino для своего проекта, и я довольно наивен. Большое спасибо., @Afshin
Я не хочу вносить какие-либо изменения в исходные строки
Вы должны прочитать о PROGMEM и/или __FlashStringHelper (F-Macro). Возможно, вы даже сможете обрабатывать такое огромное количество постоянных текстов на своем контроллере Nano, который должен быть контроллером, а не компьютером для обработки текста.
Ты прав! но мне нужно получить большой файл, а затем обработать его. Я обнаружил, что использование строки обеспечивает самую быструю скорость передачи данных, возможно, я ошибаюсь, так как я всего лишь новый программист! Кроме того, Nano BLE имеет 256 КБ оперативной памяти, поэтому я подумал, что это не должно быть проблемой., @Afshin
Arduino String никогда не бывает ни самым быстрым, ни наименее потребляющим память. Хорошо, для меня Nano — это Arduino Nano на базе atmega328 (2 КБ ОЗУ), поэтому мое беспокойство здесь может не относиться. Извини, @DataFiddler
Мне пришлось уточнить, что я использую Nano 33 BLE. Извините за недопонимание, @Afshin
Спасибо за все полезные ответы. Я думаю, также нашел способ скопировать строки. Используя «myString.substring(from,to)», я мог решить свою проблему. Команда работает и со строками массива.
mynewcopystring =mystring[2].substring(0,mystring[2].length());
У String есть конструктор, который принимает другие строки.
String mycopyString(BitSequence[1]);
создаст новый объект String с именем mycopyString, значение которого будет инициализировано значением BitSequence[1]
.
См. https://www.arduino.cc/reference/en/language /variables/data-types/stringobject/ для более подробной информации
- Как разделить входящую строку?
- Как вывести несколько переменных в строке?
- форматирование строк в Arduino для вывода
- Очень простая операция Arduino Uno Serial.readString()
- DateTime в строку
- Как преобразовать строку в массив байтов
- Как отправить строку на мастер с помощью i2c
- Создание форматированной строки (включая числа с плавающей запятой) в Arduino-совместимом C++
Что значит "не работает"? Чего вы ожидали и что произошло на самом деле?, @chrisl
вообще не используйте класс String. https://majenko.co.uk/blog/evils-arduino-strings, @Juraj
попробуй стркпи...., @Vaibhav
@chrisl «Что означает «это не работает»?» Результирующая строка пуста., @Afshin
У Arduino Nano недостаточно оперативной памяти для хранения 257 односимвольных строк., @Edgar Bonet
@EdgarBonet Я думаю, вы ошибаетесь, у него 256 КБ оперативной памяти, что много, и он может успешно хранить 1500 строк, каждая из которых имеет 64 символа., @Afshin
Тогда «Arduino-Nano», возможно, сбивает с толку, о каком устройстве вы говорите?, @DataFiddler
@DataFiddler извините за путаницу, у меня Nano 33 BLE, @Afshin
Отредактировал тег., @Edgar Bonet