Строковые операции печати случайного символа на последовательном мониторе

Я хочу извлечь имя файла MyFile.txt из пути, который хранится в строке "C:\\MyDirectory\\MyFile.txt";

Я нашел простой код на языке си, который выполняет эту работу.

string filename = "C:\\MyDirectory\\MyFile.bat";

// Удалить каталог, если он есть.
// Сделайте это до удаления расширения, если каталог имеет символ точки.
const size_t last_slash_idx = filename.find_last_of("\\/");
if (std::string::npos != last_slash_idx)
{
    filename.erase(0, last_slash_idx + 1);
}

// Удалить расширение, если оно есть.
const size_t period_idx = filename.rfind('.');
if (std::string::npos != period_idx)
{
    filename.erase(period_idx);
}

Мне пришлось изменить несколько вещей для примера кода arduino, заменить find_last_of на lastIndexOf, стереть с помощью remove и rfind с помощью lastIndexOf

Вот файл ino

#include<string>
void setup() {
  Serial.begin(9600);

}

void loop() {   
   String filename = "C:\MyDirectory\MyFile.bat";

// Удалить каталог, если он есть.
// Сделайте это до удаления расширения, если каталог имеет символ точки.
const size_t last_slash_idx = filename.lastIndexOf("\\");
if (std::string::npos != last_slash_idx)
{
    filename.remove(0, last_slash_idx + 1);
}

// Удалить расширение, если оно есть.
const size_t period_idx = filename.lastIndexOf('.');
if (std::string::npos != period_idx)
{
    filename.remove(period_idx);
}  
Serial.println(filename);
delay(1000);
}

Ожидаемый вывод MyFile

Когда я смотрю в последовательный монитор, я получаю

c$$⸮'<;⸮⸮/<⸮⸮$⸮''⸮;,#$$⸮'<;⸮⸮'<⸮⸮$⸮''⸮:$#$$⸮'<;⸮⸮'<⸮⸮$⸮''⸮;$#$$⸮'

Что я делаю не так?

, 👍0

Обсуждение

Вы выбрали 9600 бод в последовательном мониторе?, @chrisl

Да, это было на "9600", @Santhosh Dhaipule Chandrakanth


1 ответ


1
#include<string>

Уберите это. Arduino использует свой собственный класс строк, отличный от STL строка.

String filename = "C:\MyDirectory\MyFile.bat";

В строках C++ нет escape-последовательности "\M". Ты, наверное, имеешь в виду "C:\\MyDirectory\\MyFile.bat".

const size_t last_slash_idx = filename.lastIndexOf("\\");

Строка::lastIndexOf() возвращает значение int, а не size_t.

if (std::string::npos != last_slash_idx)

Здесь нет строки std::. Строка::lastIndexOf() возвращает значение -1, означающее , что символ не был найден.

Со всеми этими исправлениями ваш скетч должен работать так, как задумано.

,