打印字符串而不转义字符

时间:2012-02-24 17:59:44

标签: c++

此代码:

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覆盖。

当遇到转义字符时,如何将字符串打印为一堆字符而不是修改控制台输出?

编辑:澄清。

希望我的字符串为ats203?\r。这是因为微控制器是使用AT command的略微修改版本控制的,并且在读取\r 之前不接受该命令。当字符串被推送到微控制器时,它会将\r作为回车符读取,并对\r之前读取的内容进行操作。

我想要的是显示我构建的字符串。根据在运行时设置的标志,在其他地方有许多其他命令可以创建。所以我最终得到的字符串看起来像ate1\ratv0\rat+OSA=7\rat+OSX=255\r

我想看看我构建的内容以及我正在推动的内容。我不能这样做,因为std::cout读取回车符,操作它,并破坏我的控制台输出。

编辑:再次澄清: 我希望生成std::cout << "Writing: [" << str << "] to board." << std::endl;(当strats203?\r时):

Writing: [ats203?\r] to board. 

4 个答案:

答案 0 :(得分: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 :(得分: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]);
}

答案 2 :(得分: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>

编辑:添加副本的代码,感谢jrok指出那个:)

答案 3 :(得分: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