扩展字符串中的控制字符

时间:2011-02-21 04:16:21

标签: c++ string

在我的应用程序中,我正在接收std :: strings,如下所示

"12\tcout << \"Text\" << endl;\n"

(从gdb的机器界面输出)我想扩展控制字符,使字符串变为

12    cout << "Text" << endl;

除了通过char解析字符串char并用相应的漂亮打印序列替换每个字符序列之外,还有更好的方法吗?

2 个答案:

答案 0 :(得分:2)

  

除了通过char解析字符串char并用相应的漂亮打印序列替换每个字符序列之外,还有更好的方法吗?

不,并且没有标准库的功能可以执行此操作,但如果有的话,它只会简单地用char解析字符串char。

std::string expand_tabs_and_escapes(std::string const& s, int tabstop=8) {
    assert(tabstop >= 1);
    std::string r;
    for (std::string::const_iterator x = s.begin(); x != s.end(); ++x) {
        switch (*x) {
        case '\\':
            if (++x == s.end()) handle_bad_escape();
            else {
                switch (*x) {
                case 't':
                    goto tab;
                case 'n':
                    r += '\n';
                    break;
                // and so on for other escapes: \, ", r, v, f, etc.
                default:
                    handle_bad_escape();
                }
            }
            break;
        case '\t':
tab:
            r += std::string(tabstop - (r.size() % tabstop), ' ');
            break;
        default:
            r += *x;
        }
    }
    return r;
}

您也可以将其分解为expand_escapes,它将\ t转换为实际的选项卡,而expand_tabs则将所有选项卡转换为空格。虽然再次阅读,但看起来您的数据中没有转义符,例如“\\ t”,但实际的控制字符,所以您只需要上面的expand_tabs功能。

答案 1 :(得分:0)

您可以创建一个替换字符的正则表达式,尽管它取决于字符串的格式。否则它可能就像你自己建议的那样简单。