替换 C++ 字符串中的标点符号

Posted

技术标签:

【中文标题】替换 C++ 字符串中的标点符号【英文标题】:Replace punctuation in C++ string 【发布时间】:2019-06-17 22:56:13 【问题描述】:

我试图理解为什么 binary_search() 找不到某些标点符号,而 find() 可以:

array<char, 25> punctuation_chars'\'', '\"', ',', '.', ';', ':', '+', '*', '-', '_', '?', '!', '=', '|', '^', '/', '\\', '(', ')', '[', ']', '', '', '<', '>';

bool is_punctuation(char c)

    auto ret = find(cbegin(punctuation_chars), cend(punctuation_chars), c) != cend(punctuation_chars);
    // auto ret = binary_search(cbegin(punctuation_chars), cend(punctuation_chars), c);
    if (c == ',')
        cout << c << " is" << (ret ? "" : " not") << " punctuation" << endl;
    return ret;

注释行不起作用(例如,对于 c == ',' 返回 false),而 find 返回 cend(punctuation_chars)...

【问题讨论】:

您确定punctuation_chars 已排序吗?可以拨打std::is_sorted(punctuation_chars.begin(), punctuation_chars.end())查看(不是:wandbox.org/permlink/tpTR98nXBqmSncCY) 您是否阅读了binary_search 的文档?你知道什么是二分搜索算法以及它是如何工作的吗?你查到了吗? 你是对的,只是在没有 C++ 的几年之后,我忘记了简单的事情有多难。使用 javascript 工作我已经习惯了很棒的 lodash 库,当我发现二进制搜索时,我只是想“这是一种接受容器、搜索值并返回 bool 的方法”,并没有问自己容器是否必须被排序。我的错。 【参考方案1】:

punctuation_chars 未排序,因此std::binary_search 不起作用。您需要拨打std::sort

std::sort(std::begin(punctuation_chars), std::end(punctuation_chars));

【讨论】:

以上是关于替换 C++ 字符串中的标点符号的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有正则表达式的情况下在 C++ 中实现有效的全字字符串替换?

替换字符串中的反向引用语法(为啥是美元符号?)

替换长json字符串中的新行符号[关闭]

在C++中,如何只保留字符串中的数字而去除字母和符号,请给出示例语句,谢谢

C++中如何消除CString类型字符串中的标点符号?

替换给定 unicode 字符串中的所有表情符号