Удаление управляющих символов из строки

#c #string #data-manipulation #esp32

#c #строка #манипулирование данными #esp32

Вопрос:

У меня есть заданная строка, которая содержит следующее содержимое (поэтому следующие строки хранятся в строковой переменной):

 S*⸮
------------------------
K!
NAG                00.10
K"
NMAGICSTAR 2 L    V1.0-1
K#
AUFSTELLORT:  S 00000000
K$
GERAET NR.:   0000000000
KC
ZULASSUNGS NR.:411107770
K)
BAUART:          NAG5A02
K(
ABLAUFDATUM:     2021/04
------------------------
 

Кто-нибудь может мне помочь или дать мне короткую подсказку, как удалить управляющие коды (соответственно S*⸮ , соответственно K! ) из этой строки (перед управляющим кодом всегда есть маленький прямоугольник, я не знаю, почему он удаляется)? Так что, в конце концов, это

 ------------------------
NAG                00.10
NMAGICSTAR 2 L    V1.0-1
AUFSTELLORT:  S 00000000
GERAET NR.:   0000000000
ZULASSUNGS NR.:411107770
BAUART:          NAG5A02
ABLAUFDATUM:     2021/04
------------------------
 

Позвольте мне, наконец, процитировать кое-что из документации, может быть, это поможет:

Каждая строка имеет максимальное значение. длина 24 символа и должна заканчиваться LF [0Ah]

Управляющий код «ESC ‘S’ 21h LF» означает: XON Startsequence с кодом производителя, машинным кодом и кодом набора данных

Я пытаюсь выполнить всю эту задачу на ESP32 / Arduino IDE (C ).

Комментарии:

1. Итак, вы хотите разделить строку на новые строки, удалить нечетные строки, собрать ее обратно?

2. Для поиска в C «как разделить строку», если вы хотите C, вам, вероятно, придется обойти строку, используя что-то вроде strtok , и скопировать биты, которые вы хотите сохранить, в другую строку.

3. Показать шестнадцатеричный дамп исходной строки.

4. Здравствуйте и большое спасибо вам обоим за ваши ответы… Да, абсолютно правильно, если это возможно в C , это было бы целью. Извините, что мне приходится переписывать, но как получить шестнадцатеричный дамп исходной строки? ^^ Наилучшие пожелания

Ответ №1:

Это не ответчик. Вы можете использовать следующий код для печати строки как целого числа в шестнадцатеричной форме. Каждые 12 символов — широкое разделение, а каждые 24 — новая строка. Упорядочивание упрощает подсчет 24 символов.

 #include <iostream>
void dump_str(const std::stringamp;str)
{
    int n;
    std::cout << std::hex;

    for (int i=0; i<str.size(); i  )
      {
          n = str[i];
          if (i%24==0) std::cout << std::endl;
             else if (i%12 == 0 ) std::cout <<"  ";
          if (n<16) std::cout << " " << '0' << n;
          else  std::cout << " " << n;
       }
}
int main ()
{
  std::string str ( "somerttestrst2athis is n a ran5dom10gnnTake this for granted. To bo or not to beaatt");
  dump_str(str);
}
 

Распечатайте этот пример: (значение числа можно проверить в поиске Google в таблице ascii.)

 73 6f 6d 65 0d 09 74 65 73 74 0d 73  74 02 07 74 68 69 73 20 69 73 20 0a
20 61 20 72 61 6e 05 64 6f 6d 08 67  0a 0a 54 61 6b 65 20 74 68 69 73 20
66 6f 72 20 67 72 61 6e 74 65 64 2e  20 54 6f 20 62 6f 20 6f 72 20 6e 6f
74 20 74 6f 20 62 65 07 07 09 09
 

Отправьте строку в вышеприведенную функцию dum_str(string) и скопируйте результирующую таблицу, добавив ее к вашему сообщению.

Ответ №2:

Вот как разделить строку на символы r и n . Таким образом, вы можете повторять каждую строку отдельно.

     void str_split(const std::stringamp; in,  std::vector<std::string>amp; out, const std::stringamp; delim=" trn")
    {
        std::string::size_type firstPos = in.find_first_not_of(delim);
        std::string::size_type secondPos = in.find_first_of(delim, firstPos);
        out.clear();
        if(firstPos != std::string::npos)
            out.push_back( in.substr( firstPos, secondPos - firstPos ) );
        while( secondPos != std::string::npos )
        {
            firstPos = in.find_first_not_of(delim, secondPos);
            if(firstPos == std::string::npos)
                break;
            secondPos = in.find_first_of( delim, firstPos );
            out.push_back( in.substr( firstPos, secondPos - firstPos ) );
        }
    }