2012-02-24 23 views
5

questo codice:stringa di stampa senza caratteri fuga

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

prende un string e lo spinge su un collegamento seriale ad un microcontrollore. (Funziona bene). Tuttavia, quando provo a spingere un così: write("ats203?\r"), l'uscita della console è simile al seguente:

] to board.ts203? 

Così il Writing: [a viene sovrascritta dal ] to board. dopo std::cout incontra la \r nella stringa.

Come posso stampare la stringa come un gruppo di caratteri anziché l'output della console di mangling quando viene rilevato un carattere di escape?

MODIFICA: Per chiarire.

I voglio la mia stringa da ats203?\r. Questo perché il microcontrollore viene controllato utilizzando una versione leggermente modificata di AT command e non accetta il comando finché non legge \r. Quando la stringa viene trasferita al microcontrollore, legge \r come ritorno a capo e agisce su elementi letti prima dello \r.

Quello che voglio è visualizzare la stringa che ho costruito. C'è un sacco di altri comandi altrove che vengono creati in base ai flag impostati in fase di esecuzione. Quindi finisco con stringhe che assomigliano a ate1\ratv0\rat+OSA=7\rat+OSX=255\r.

Mi piacerebbe vedere cosa ho costruito e cosa sto spingendo. Non posso farlo perché std::cout legge il ritorno a capo, agisce su di esso e manipola l'output della mia console.

EDIT: Precisazione, ancora una volta: voglio std::cout << "Writing: [" << str << "] to board." << std::endl; per produrre (quando str è ats203?\r):

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

Si può sfuggire il carattere di escape, quindi '\\ R' lascerà la stringa come un letterale' "\ r" '. ... non è sicuro se è quello che vuoi o no. – prelic

+0

Non capisco, perché c'è un '\ r' nella stringa, in primo luogo? Cosa ti piacerebbe invece produrre? –

+0

'\ r' è un carattere di ritorno a capo - farà" cursore "tornare all'inizio della riga. Forse volevi un carattere di nuova riga, '\ n'? – jrok

risposta

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); 

Allora write("ats203?\r") sarà letteralmente stampare

ats203?\r 
1

Non è esattamente 'pressare' i personaggi a causa di una sequenza di escape. Il \ r 'reimposta il cursore, cioè è un ritorno a capo. Quindi, il cursore si posiziona all'inizio e qualsiasi cosa sia stata digitata sovrascrive ciò che è presente sulla linea.

Si può solo cancellare ogni istanza di \r nella stringa:

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); 
} 

NOTA: remove è una funzione in <algorithm>, quindi non dimenticate di #include <algorithm>.

EDIT: Codice per fare una copia aggiunto, grazie a JROK per indicare che uno su :)

+0

Non è possibile farlo, 'str' è const. – jrok

+0

Oh .. non l'ho visto. Farò un cambiamento. –

+0

Se non c'è una soluzione migliore, posso rimuovere i caratteri incriminati prima di visualizzarli; Speravo che ci fosse un modo in cui non avrei dovuto farlo, però. – simont

1

È possibile scrivere una funzione per unescape quei personaggi.Esempio:

#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; 
} 

uscita:

hello\r\nworld\tsome\\words 
2

Ecco un breve ciclo per generare una stringa leggibile.

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]); 
}