我正在编写一个QT小部件应用程序,其中包括与Arduino的串行通信。 I found a good header and cpp file on GitHub使得与Arduino MUCH的通信比使用QSerialPort更容易。
但是,这提出的一个难点是端口名称必须以“\\。\ COM1”格式的char数组形式给出。所以我试图在COM端口名称之前添加这些反斜杠,使用以下代码:
QString currentPort = "\\\\.\\" + QString(ui->serialPortDropdown->itemText(index));
portName = currentPort.toLocal8Bit().data();
在我的cpp文件顶部用数据初始化数组之后:
char *portName;
在这里和那里添加几个qDebug()之后,QString被设置为它应该是什么样,例如"\\\\.\\COM1"
。但char数组返回"\\.\COM1"
。所以反斜杠正在取消其他反斜杠。
我如何克服这个问题?
提前感谢您的任何帮助:)
答案 0 :(得分:0)
QString正在转义。也就是说,特殊字符(包括)使用它们的转义序列(here维基百科关于转义的文章来指定)。
由于反斜杠字符的转义序列为 \\ ,您只需加倍反斜杠:
QString currentPort = "\\\\\\\\.\\\\" + QString(ui->serialPortDropdown->itemText(index));
答案 1 :(得分:0)
问题在于,在你的“普通”字符串文字中,反斜杠会引入“特殊”字符,例如新行\n
。要获得一个反斜杠,您必须输入两个连续的反斜杠,即\\
以获得\
。
要解决此问题,请输入两次反斜杠,或使用raw格式指定字符串文字:
int main() {
const char* raw = R"foo(\\\\.\\)foo";
cout << "raw: " << raw << endl;
const char* notRaw = "\\\\.\\";
cout << "not raw: " << notRaw << endl;
}
输出:
raw: \\\\.\\
not raw: \\.\
请注意,“foo(” - 部分是自定义的;它可以是您选择的任何内容,不会包含在字符串文字的内部。
答案 2 :(得分:0)
这是C ++源文件中的正常行为。而且还有更多:
转义序列用于表示字符串文字和字符文字中的某些特殊字符。
可以使用以下转义序列(可以使用实现定义的语义提供额外的转义序列):
Escape | Description |Representation
sequence | |
-------------+-----------------------------+-------------------------------------------------------
\' | single quote |byte 0x27 in ASCII encoding
\" | double quote |byte 0x22 in ASCII encoding
\? | question mark |byte 0x3f in ASCII encoding
\\ | backslash |byte 0x5c in ASCII encoding
\a | audible bell |byte 0x07 in ASCII encoding
\b | backspace |byte 0x08 in ASCII encoding
\f | form feed - new page |byte 0x0c in ASCII encoding
\n | line feed - new line |byte 0x0a in ASCII encoding
\r | carriage return |byte 0x0d in ASCII encoding
\t | horizontal tab |byte 0x09 in ASCII encoding
\v | vertical tab |byte 0x0b in ASCII encoding
\nnn | arbitrary octal value |byte nnn
\xnn | arbitrary hexadecimal value |byte nn
\unnnn | universal character name (arbitrary Unicode value); may result in several characters
| |code point U+nnnn
\Unnnnnnnn | universal character name (arbitrary Unicode value); may result in several characters
| |code point U+nnnnnnnn
如果这是一个问题,那么C ++ 11引入了一种新类型的字符串文字:原始字符串文字
原始字符串文字。用于避免任何角色的转义。分隔符之间的任何内容都成为字符串的一部分。
语法:
prefix R " delimiter ( raw_characters ) delimiter "
) delimiter "
要解决这个问题,有2个解决方案
在每个需要反斜杠的地方插入2个反斜杠:"\\\\\\\\.\\\\"
使用原始字符串:R"(\\\\.\\)"