Сейчас 2023 год, и я думаю, что это глупо, что идентификатор строки — это то, что так часто встречается в тексте, а также в других языках, таких как разметка.
C++ использует символ "
для обозначения начала и конца строки.
Есть ли способ сделать этот символ чем-то другим?
Например, \xac
, который также является 1-байтовым символом.
Например, если бы идентификатор строки был чем-то отличным от двойной кавычки, то использование функции system()
было бы намного проще в использовании, где двойные кавычки пригодились бы очень кстати.
Это относится и к чему-то вроде PHP. Я использую echo '<div class = "adiv"></div>'
с одинарными кавычками, чтобы писать что-то внутри с помощью двойных кавычек, но иногда мне нужно иметь возможность использовать как двойные, так и одинарные кавычки.
Действительно ли мы ограничены кавычками и двойными кавычками в качестве разделителей? Разве мы не можем использовать или установить пользовательский символ, который больше нигде не появляется?
Если это выполнимо, пожалуйста, скажите мне, как. Если это несбыточная мечта, дайте мне знать.
//Example: (I know the character I'm about to use is 3-bytes (\xe2\x81\x91) but just for demonstration...
#include <iostream>
int main() {
std::cout << ⁑Hello world!\n⁑;
system(⁑echo -e '"hello\nworld"' | grep 'hello' | sed s/'"hello'/'"Hello!"'/⁑);
return 0;
}
Я пробовал искать многие страницы (разбивки на страницы?) Google, и я даже не могу найти никого, кто задал вопрос.
Если проблема, которую вы описываете, заключается в том, что «[quote] — это то, что так часто встречается в тексте», ее решением является необработанный строковый литерал. R"(echo -e '"hello\nworld"')"
Говоря с точки зрения конструкции компилятора, лексирование строковых литералов происходит очень рано. Включение чего-то в сам код, чтобы изменить это, было бы довольно раздражающим, учитывая, что на данный момент код представляет собой суп из символов. Однако даже параметр компилятора потенциально может привести к тому, что DFA, созданный во время компиляции (в компиляторе, а не в вашей программе), станет средой выполнения или сохранит большую часть предварительно созданного DFA и будет иметь другой особый случай для строковых литералов, которые должны быть обработаны. с отдельно. (Хотя высококачественные компиляторы, вероятно, все равно лексируют вручную, вариант DFA по-прежнему подходит для 90%+.)
Вы ищете escape-символ \ ? например char const * three = "\"three\"";
«использование функции system() было бы намного проще» — упрощение использования system()
не должно быть целью — на самом деле совсем наоборот. Эта функция — кошмар безопасности, и ее никогда не следует использовать в новом коде (а старый код следует реорганизовать, чтобы избавиться от нее).
@JesperJuhl, что бы вы порекомендовали на его место? Я хочу научиться манипулировать файлами в моей системе, используя bash для склеивания моего кода на С++. В любом случае, bash - это не просто клей? Также вы знаете, что даже если это плохой пример, моя точка зрения остается в силе......
@ED818 В Windows CreateProcessEx()
, в системах на базе Unix fork()
+ exec()
(или один из его вариантов). В обоих случаях вы получаете контроль над тем, в какой среде запускается новый процесс, какая оболочка (если таковая имеется) будет использоваться, вы можете взаимодействовать с потоком stdin
процесса, вы можете получать доступ к потокам stdout
и stderr
процесса по отдельности и многое другое. С system()
вы отказываетесь от всего этого контроля и даете злоумышленнику множество вариантов, чтобы манипулировать тем, что вы пытаетесь выполнить.
Если я правильно понимаю вашу проблему, это можно легко решить, используя необработанные строковые литералы, например:
std::string myStr = R"('Using single quotes', "double quotes")";
Все, что находится внутри этих скобок от "(
до )"
, будет рассматриваться как строка, и вы можете написать все, что захотите, внутри этой строки, даже написать многострочную строку без \
. Обратите внимание, что такие символы, как \n
, \r
, также будут рассматриваться не как «новая строка» или «возврат каретки», а как они написаны.
"в этой строке вы можете написать что угодно" - ну, почти что угодно. В вашем примере строка не может содержать последовательность символов )"
, иначе строка преждевременно порвется. Если вам нужны эти символы, вам нужно будет указать собственный разделитель для различения, например: std::string myStr = R"delim('Using single quotes', "double quotes", and even )" too)delim";
Вместо этого, возможно, вы захотите использовать литерал необработанной строки: https://stackoverflow.com/questions/56710024/what-is-a-raw-string