Как остановить обратную косую черту от отмены преобразования из QString в массив символов? - PullRequest
0 голосов
/ 16 мая 2018

Я пишу приложение для виджетов QT, которое включает в себя последовательную связь с Arduino. Я нашел хороший заголовочный файл и файл cpp на GitHub , который делает связь с Arduino НАМНОГО проще, чем с QSerialPort.

Однако одна сложность, которую это представляет, состоит в том, что имя порта должно быть задано как массив символов, например, в формате "\\. \ COM1". Поэтому я пытаюсь добавить эти обратные косые черты перед именем COM-порта с помощью этого кода:

QString currentPort = "\\\\.\\" + QString(ui->serialPortDropdown->itemText(index));
portName = currentPort.toLocal8Bit().data();

После инициализации массива в верхней части моего cpp-файла:

char *portName;

После добавления нескольких qDebug () здесь и там, QString устанавливается на то, что и должно быть, например "\\\\.\\COM1". Но массив char возвращается как "\\.\COM1". Таким образом, обратные косые черты отменяют другие обратные косые черты.

Как мне преодолеть это?

Заранее спасибо за любую помощь:)

Ответы [ 3 ]

0 голосов
/ 16 мая 2018

Проблема в том, что в «обычном» строковом литерале, таком как ваш, обратная косая черта вводит «специальные» символы, такие как, например, новая строка \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 (" является пользовательской; она может быть любой по вашему выбору, которая не будет содержатьсяво внутренней части строкового литерала.

0 голосов
/ 16 мая 2018

Это нормальное поведение в исходных файлах C ++.И их еще больше:

Escape-последовательности используются для представления определенных специальных символов в строковых литералах и символьных литералах.

Доступны следующие escape-последовательности (дополнительные escape-последовательности могутпредоставляется семантика, определяемая реализацией):

 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-последовательности

Если это проблема, то C ++ 11 ввелновый тип строкового литерала: необработанный строковый литерал

необработанный строковый литерал.Используется, чтобы избежать побега любого персонажа.Все, что находится между разделителями, становится частью строки.

Синтаксис:

prefix R " delimiter ( raw_characters ) delimiter "

  • префикс - (необязательно) Один из L, u8, u, U
  • delimiter - последовательность символов, состоящая из любого исходного символа, кроме скобок, обратной косой черты и пробелов (может быть пустым и длиной не более 16 символов)
  • raw_characters - Любая последовательность символов, за исключением того, что она не должна содержать закрывающую последовательность ) delimiter "

Источник: строковый литерал


Для решенияпроблема есть 2 решения

  1. В каждом месте, где требуется обратная косая черта, вставьте две обратные косые черты: "\\\\\\\\.\\\\"

  2. Используйте необработанную строку: R"(\\\\.\\)"

0 голосов
/ 16 мая 2018

QString экранирован . То есть специальные символы (включая) указываются с использованием их escape-последовательности ( здесь статья в Википедии о побеге).

Поскольку escape-последовательность для символа обратной косой черты \\ , вам просто нужно удвоить обратную косую черту:

QString currentPort = "\\\\\\\\.\\\\" + QString(ui->serialPortDropdown->itemText(index));
...