文字列のエスケープされた文字列表現を取得したい場合があります。この場合、コンソールに出力を出力したいのですが、出力には任意の文字 (タブ、NL、CR など) を含めることができます。ライン)。
例えばescape("hello\tworld\n") == "hello\\tworld\\n"
このために独自の関数を作成する必要がありますか? 私はそう思う。
ご回答ありがとうございます。
C ++11より前のC++では、これを自分で行う必要があります。C ++ 11には、すべてを保持する「生の文字列」型があります。例を参照してください:https://en.wikipedia.org/wiki/C%2B%2B11
生の文字列は次のように表されR"<delim>(<text>)<delim>"
ます。<delim>は、最大16文字の文字列シーケンス(空の文字列を含む)にすることができます。<delim>の文字にはいくつかの制限があることに注意してください。ただし、とにかく読みやすくしたいので、それは問題にはならないはずです。
したがって、あなたの例は次のようになります。
char const* str = R"(hello\tworld\n)";
私が書いたストリームベースのソリューションの1つを次に示します(ストリームが目的の宛先であることが判明した場合は、それに応じて変更できます):
std::string escape(std::string const &str) {
std::ostringstream result;
for (string::const_iterator it = str.begin(); it != str.end(); it++) {
if (' ' <= *it && *it <= '~') {
result << *it;
} else {
result << "\\x" << std::setw(2) << std::hex << std::setfill('0') << *it;
}
}
return result.str();
}
また、C/C++ と同じ一般的な印刷不可能なエスケープ コードを使用する別の例を次に示します。
std::string escape(std::string const &str) {
std::ostringstream result;
for (string::const_iterator it = str.begin(); it != str.end(); it++) {
if (' ' <= *it && *it <= '~') {
result << *it;
} else {
switch (*it) {
case '\a':
result << "\\a";
break;
case '\b':
result << "\\b";
break;
case '\f':
result << "\\f";
break;
case '\n':
result << "\\n";
break;
case '\r':
result << "\\r";
break;
case '\t':
result << "\\t";
break;
case '\v':
result << "\\v";
break;
default:
result << "\\x" << std::setw(2) << std::hex << std::setfill('0') << *it;
}
}
return result.str();
}