Копирование строки в другую строку

string arduino-nano-ble

В моем коде есть массив строк:

String BitSequence [257];

Каждая строка будет содержать от 23 до 64 символов. В какой-то момент в моем коде я должен использовать команду «myString.remove ()», и я не хочу применять какие-либо изменения к моим исходным строкам. Мне нужно сделать копию и выполнить мои команды в скопированной строке. Я сделал:

MycopyString = BitSequence [1];

но это не работает. Какие трюки мне нужно сделать здесь, чтобы сделать копию?

, 👍-1

Обсуждение

Что значит "не работает"? Чего вы ожидали и что произошло на самом деле?, @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


4 ответа


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

2

Не работайте с классом 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


1

Я не хочу вносить какие-либо изменения в исходные строки

Вы должны прочитать о PROGMEM и/или __FlashStringHelper (F-Macro). Возможно, вы даже сможете обрабатывать такое огромное количество постоянных текстов на своем контроллере Nano, который должен быть контроллером, а не компьютером для обработки текста.

,

Ты прав! но мне нужно получить большой файл, а затем обработать его. Я обнаружил, что использование строки обеспечивает самую быструю скорость передачи данных, возможно, я ошибаюсь, так как я всего лишь новый программист! Кроме того, Nano BLE имеет 256 КБ оперативной памяти, поэтому я подумал, что это не должно быть проблемой., @Afshin

Arduino String никогда не бывает ни самым быстрым, ни наименее потребляющим память. Хорошо, для меня Nano — это Arduino Nano на базе atmega328 (2 КБ ОЗУ), поэтому мое беспокойство здесь может не относиться. Извини, @DataFiddler

Мне пришлось уточнить, что я использую Nano 33 BLE. Извините за недопонимание, @Afshin


-1

Спасибо за все полезные ответы. Я думаю, также нашел способ скопировать строки. Используя «myString.substring(from,to)», я мог решить свою проблему. Команда работает и со строками массива.

mynewcopystring =mystring[2].substring(0,mystring[2].length());
,

-1

У String есть конструктор, который принимает другие строки.

String mycopyString(BitSequence[1]);

создаст новый объект String с именем mycopyString, значение которого будет инициализировано значением BitSequence[1].

См. https://www.arduino.cc/reference/en/language /variables/data-types/stringobject/ для более подробной информации

,