此代码:
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;
(当str
为ats203?\r
时):
Writing: [ats203?\r] to board.
答案 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