2012-02-24 6 views
5

Этот код:печати строка без вылетающих символов

void Controller::write(const std::string& str) { 
    std::cout << "Writing: [" << str << "] to board." << std::endl; 
    s.write(str); 

принимает string и толкает его через последовательный канал связи с микроконтроллером. (Это прекрасно работает). Однако, когда я пытаюсь нажать, как это: write("ats203?\r") вывод консоли выглядит следующим образом:

] to board.ts203? 

Writing: [a Так перезаписывается самая ] to board. после std::cout встречает \r в строке.

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

EDIT: уточнить.

I хочу моя строка должна быть ats203?\r. Это связано с тем, что микроконтроллер управляется с использованием слегка модифицированной версии AT command, а не принимает команду до тех пор, пока она не прочитает. Когда строка помещается в микроконтроллер, она считывает \r в качестве возврата каретки и действует на вещи, которые она считывает до \r.

Я хочу показать строку, которую я построил. Существует множество других команд в другом месте, которые создаются в зависимости от флагов, установленных во время выполнения. Поэтому я получаю строки, которые выглядят примерно как ate1\ratv0\rat+OSA=7\rat+OSX=255\r.

Я хотел бы посмотреть, что я построил и что я нажимаю. Я не могу этого сделать, потому что std::cout читает возврат каретки, воздействует на него и управляет выходом моей консоли.

EDIT: Разъяснения, снова: Я хочу std::cout << "Writing: [" << str << "] to board." << std::endl; производить (при str является ats203?\r):

Writing: [ats203?\r] to board. 
+3

Вы можете избежать экранирующего символа, поэтому '\\ r' оставит строку как литерал' "\ г" '. .. не уверен, что это то, чего вы хотите или нет. – prelic

+0

Я не понимаю, почему в вашей строке есть '\ r'? Что бы вы хотели вывести вместо этого? –

+0

'\ r' - символ возврата каретки - он заставит« курсор »вернуться к началу строки. Возможно, вам нужен символ новой строки, '\ n'? – jrok

ответ

5
void Controller::write(const std::string& command_string) { 

    std::string display_string = std::regex_replace(command_string,std::regex("(\r)"),"\\r"); 

    std::cout << "Writing: [" << display_string << "] to board.\n"; 
    s.write(command_string); 

Итак write("ats203?\r") буквально распечатать

ats203?\r 
1

Это не совсем 'коверкая' символы из-за последовательности. «\ R» сбрасывает ваш курсор, т. Е. Это возврат каретки. Следовательно, ваш курсор переходит к началу, и все, что набирается, теперь перезаписывает все, что есть на линии.

Вы можете просто удалить любой экземпляр \r в строке:

void Controller::write(const std::string& str) { 
    std::string str2(str); //Make a copy of the string as you are getting a const reference 
    char remove[] = "\r"; //Add any characters you wish to remove 

    for (unsigned int i = 0; i < sizeof(chars); ++i) { 
     str2.erase(std::remove(str2.begin(), str2.end(), chars[i]), str2.end()); 
    } 

    std::cout << "Writing: [" << str2 << "] to board." << std::endl; 
    s.write(str); 
} 

ПРИМЕЧАНИЕ: remove функция в <algorithm>, так что не забудьте #include <algorithm>.

EDIT: Код, чтобы сделать копию добавил, спасибо Джрок за указание, что один из :)

+0

Вы не можете этого сделать, 'str' const. – jrok

+0

Ох .. Я этого не видел. Я сделаю изменения. –

+0

Если нет лучшего решения, я могу вычеркнуть нарушающие символы, прежде чем я их покажу; Я надеялся, что мне не придется это делать. – simont

1

Вы можете написать функцию экранирования в эти символы.Пример:

#include <string> 
#include <iostream> 

std::string unescape(const std::string& str){ 

    std::string res; 
    for(int i=0; i<str.length(); ++i){ 
     switch (str[i]){ 
      case '\r': 
       res+="\\r"; 
       break; 
      case '\n': 
       res+="\\n"; 
       break; 
      case '\\': 
       res+="\\\\"; 
       break; 
      case '\t': 
       res+="\\t"; 
       break; 
      //add other special characters if necessary... 
      default: 
       res += str[i]; 
     } 
    } 
    return res; 
} 

int main(){ 
    std::cout << unescape("hello\r\nworld\tsome\\words") << std::endl; 
} 

Выход:

hello\r\nworld\tsome\\words 
2

Вот быстрый цикл для создания читаемой строки.

std::string str2; 
for (int i = 0; i < str.length(); ++i) 
{ 
    if (str[i] == '\r') 
    { 
     str2.push_back('\\'); 
     str2.push_back('r'); 
    } 
    else 
     str2.push_back(str[i]); 
}