如何在从QString到char数组的转换中阻止反斜杠取消?

时间:2018-05-16 14:24:14

标签: c++ qt char qstring

我正在编写一个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"。所以反斜杠正在取消其他反斜杠。

我如何克服这个问题?

提前感谢您的任何帮助:)

3 个答案:

答案 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

来源:Escape sequences

如果这是一个问题,那么C ++ 11引入了一种新类型的字符串文字:原始字符串文字

  

原始字符串文字。用于避免任何角色的转义。分隔符之间的任何内容都成为字符串的一部分。

语法:

prefix R " delimiter ( raw_characters ) delimiter "

  • 前缀 - (可选)L,u8,u,U中的一个
  • 分隔符 - 由任何源字符组成的字符序列,但括号,反斜杠和空格(可以为空,最多16个字符)
  • raw_characters - 任何字符序列,但不得包含结束序列) delimiter "

来源:string literal

要解决这个问题,有2个解决方案

  1. 在每个需要反斜杠的地方插入2个反斜杠:"\\\\\\\\.\\\\"

  2. 使用原始字符串:R"(\\\\.\\)"