0

文字列のエスケープされた文字列表現を取得したい場合があります。この場合、コンソールに出力を出力したいのですが、出力には任意の文字 (タブ、NL、CR など) を含めることができます。ライン)。

例えばescape("hello\tworld\n") == "hello\\tworld\\n"

このために独自の関数を作成する必要がありますか? 私はそう思う。

ご回答ありがとうございます。

4

2 に答える 2

3

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)";
于 2012-09-16T20:03:06.673 に答える
0

私が書いたストリームベースのソリューションの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();
}
于 2013-03-01T04:31:28.780 に答える