Я новичок в C ++, и я пытаюсь сгенерировать строку «команда \ r \ n». Тем не менее мне нужен сырой возврат каретки & новая строка (см. код ниже). Я пробовал R «(команда \ r \ n)», но я не думаю, что у меня есть правильная версия для использования необработанных строк. Какие есть альтернативные варианты (с использованием Linux)?
Вот код: я пытаюсь записать в последовательный порт, используя строковую команду. Контроллер требует \ r \ n.
//serial port write function
int write_only(int fd, string str) {
if (write(fd, str.c_str(), str.length()) == -1)
{
printf("write failed \n");
}
}
// this call works
write_only(fd, "command\r\n");
Этот вызов не работает, но он мне нужен, чтобы я мог легко генерировать команды:
string buff = "command\r\n";
write_only(fd, buff);
Необработанные строки в основном для ситуаций, когда вы не хочу C escape-последовательности вообще. Это особенно полезно в тех случаях, когда \
Символ используется с осмысленными целями внутри самой строки, поэтому вам не нужно избегать его на уровне языка программирования.
Например, представьте себе случай регулярных выражений POSIX или C ++ 11, которые имеют много символов со специальным значением, а также используют \
в качестве escape-символа для возврата таких символов обратно их буквальным корреспондентам в строке для сопоставления. Теперь представьте, что вы хотите проанализировать UNC-имя в стиле Windows в форме \\computer\share\pathname\filename
, Сравните два возможных способа разделения этих четырех компонентов.
// With C-style strings: every "\" in the string to be parsed requires
// "\\" in regex level, and every "\" in regex level requires "\\" in
// language level.
regex unc_parser1("^\\\\\\\\([A-Za-z0-9._-]+)\\\\([^\\\\]+)\\\\((.*)\\\\)?([^\\\\]+)$");
// With raw strings: each desired "\" has to be escaped only in regex level.
regex unc_parser2(R"(^\\\\([A-Za-z0-9._-]+)\\([^\\]+)\\((.*)\\)?([^\\]+)$)");
(Конечно, все может быть намного сложнее, чем в этом простом примере …)
С другой стороны, одно из возможных решений вашей проблемы — просто использовать простую конкатенацию строк во время компиляции. Например, все строки ниже будут иметь одинаковую последовательность символов.
char s1[]="Line 1 has special char (\")\r\nLine 2: has special char (\\)\r\nLine 3 has no special chars\r\n";
#define CRLF "\r\n"
char s2[]=
"Line 1 has special char (\")" CRLF
"Line 2: has special char (\\)" CRLF
"Line 3 has no special chars" CRLF
;
char s3[]=
R"(Line 1 has special char ("))" CRLF
R"(Line 2: has special char (\))" CRLF
R"(Line 3 has no special chars)" CRLF
;
И чтобы получить необработанные строки для компиляции в дистрибутивах Linux, где C ++ 11 еще не используется по умолчанию (все дистрибутивы, о которых я знаю, кстати), можно просто добавить -std=c++11
на ваш g++
или же clang++
вызов команды.
Кажется, опечатка, изменить:
string buf = "command\r\n";
write_only(fd, buff);
в
string buf = "command\r\n";
write_only(fd, buf);