C++:替换字符串中控制字符的最佳方式

标签 c++

对于解析工作,我有一个基本上可以是任何东西的字符串。 ' 例如:

"something \t \n \0 \whatever else"

在解析结束时,我需要将输出序列化为易于使用 JSON 的格式...这意味着我需要摆脱控制字符。对于所有值条目,我运行一个字符串清理程序:

void sanitizer(std::string & value){
   for (auto& it : value){
     if ((int) sit <= 31 || (int) sit == 127){
        if (sit == '\t')
            std::cout << "\\t";
        else if (sit == '\r')
            std::cout << "\\r";
        else if (sit == '\0')
            std::cout << "\\0";
        else if (sit == '\n')
            std::cout << "\\n";

        else 
            std::cout << " ";
      } else if (sit == '"'){
          std::cout << '\'';
      } else if (sit == '\\')
          std::cout << "/";
      else 
          std::cout << sit;
    }

但是,仅此函数就占用了解析器中大约 44% 的时间。

当我消除 std::cout 调用,而是构建一个字符串,然后打印到 cout 时,这进一步减慢了速度。


有没有优化的方法来用 C++ 替换/转义字符串中的这些控制字符?

最佳答案

一种方法是使用 std::iscntrl 函数和 std::remove_if:

void remove_control_characters(std::string& s) {
    s.erase(std::remove_if(s.begin(), s.end(), [](char c) { return std::iscntrl(c); }), s.end());
}

进一步改进是实现您自己的字符分类功能。 std::iscntrl 为此使用当前的全局区域设置对象。

关于C++:替换字符串中控制字符的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48098987/

相关文章:

java - 切换到新的qt和Gradle后不调用native方法

c++ - ld : duplicate symbol

c++ - 在 C++ 中为指针 vector 创建自定义排序时遇到问题

c++ - 如何在 Linux 上构建和运行 Unreal C++ 项目?

c++ - 用 Lapack 的 dgeqrf_ 求解线性系统

c++ - OpenGl 无法正确呈现 .obj 文件

c++ - 对数组的引用,没有按预期工作

c++ - 寻找tracee的会合结构(正在调试的程序)

c++ - “T”不是参数 'T' 的有效模板类型参数

c++ - 在 XCode 中生成 getter 和 setter