C++ 替换函数

Posted

技术标签:

【中文标题】C++ 替换函数【英文标题】:C++ replace function 【发布时间】:2020-11-02 19:31:06 【问题描述】:

我正在尝试使用替换功能将大写字母替换为小写字母。我尝试这样做的方式是,当被检查的字母在 ASCII 值 65-90 之间时,它将被替换为 ASCII 值高 32 个的字符,例如,65 将变为 97(A 到)。

char holder = (userPhrase[count]) + 32;
jumbledPhrase.replace(count, 1, holder);

变量持有者的点 为了保存要在替换中使用的新值,我收到一条错误消息,说持有者在替换函数中不算作 char 参数。甚至可以以我尝试使用的方式使用替换吗?

【问题讨论】:

无关:此分配是否禁止使用tolower 函数?使用库函数几乎总是更好,因为作者已经考虑到您可能错过的许多边缘情况,例如非 ASCII 目标,并且他们的假设将适用于数以百万计的 C++ 程序。 如果您遇到编译器错误,请在问题中发布错误并显示minimal reproducible example。相关问题:***.com/questions/313970/… @user4581301 我敢肯定,std::tolower 完全不适合任何多字节或可变字节长度编码(例如 UTF-8)并且真的只对古代 8- 有用位“扩展 ASCII”代码页。除非您有严格的、受控的输入约束,否则您不应该在 one C++ 程序中编写 std::tolower,更不用说数以百万计的了。 有locale-aware version,但这是C++ 对宽字符的混乱处理更普遍的问题。我的观点是,tolower 几十年来已经被部署了无数次,其成功率远高于那里几乎无限数量的自滚版本。 【参考方案1】:

使用tolower(),避免使用幻数,让您(以及您的代码阅读器)的生活更轻松。

阅读@churill 评论的How to convert std::string to lower case? 中的其他替代方案,例如std::transform

【讨论】:

相关:What is a magic number, and why is it bad? 好点。我将使用它。谢谢。我还将研究 transform 以了解它是如何工作的。现在,下面的约翰给出了一个可行的解决方案。 @The_Redhawk 很高兴我能帮上忙。所有三个答案都有效,只要确保选择适合您需要的答案,干杯。【参考方案2】:

我想你正在寻找

jumbledPhrase.replace(count, 1, 1, holder);

将字符串jumbledPhrasecount位置处的1(第一个1)字符替换为1字符holder的副本(第二个1)。

参考here,如果你真的在寻找其他东西

【讨论】:

当然更直接的方法是jumbledPhrase[count] = holder;【参考方案3】:

使用replace() 替换单个char 是多余的,只需使用operator[] 代替,您已经在使用它来访问正在被替换的源char

char holder = userPhrase[count] + 32;
jumbledPhrase[count] = holder;

【讨论】:

以上是关于C++ 替换函数的主要内容,如果未能解决你的问题,请参考以下文章

C++ 模板参数推导/替换失败:

c++字符串,删除字符'b'并将字符'a'替换为两个'd'的构建函数

c++字符串替换中while和strcpy具体用法

C++函数如何传递字符串

替换字符串 C++ 位置 X 中的单词

C++定义函数指针