You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++ Playfair密码程序清理字符串仅保留字母时出现末尾多余字符问题

问题根因与修复方案

核心错误原因

你错误使用了C++的erase-remove惯用法:
std::remove_if执行后会将符合保留条件的元素移动到字符串前部,返回值是指向处理后字符串逻辑末尾的迭代器。要彻底删除剩余的无效字符,需要给erase传入两个参数:第一个是remove_if返回的新逻辑起始迭代器,第二个是原字符串的end()迭代器。
你当前的代码只给erase传了一个参数,仅会删除新逻辑末尾位置的1个字符,从该位置到原字符串结尾的所有冗余字符都会保留,就是你观察到的末尾额外重复字符。

其他冗余/风险问题

  1. 你的两次过滤逻辑完全冗余:第一遍过滤std::not1(std::ptr_fun(std::isalpha))已经移除了所有非字母字符,标点、空格、数字本身就不属于字母范畴,第二遍ispunct过滤完全不需要。
  2. 直接给std::isalpha/std::ispunct传char参数存在未定义行为风险:如果你的环境中char是有符号类型,遇到值为负的字符时会触发异常,调用前需要强转为unsigned char。
  3. std::ptr_fun、std::not1属于C++旧标准废弃组件,推荐用lambda表达式替代,可读性更高。

修复后的代码

#include <cctype>
#include <algorithm>
#include <string>

std::string step1(std::string plaintext)
{
    plaintext.erase(
        std::remove_if(plaintext.begin(), plaintext.end(), [](unsigned char c) {
            // 只保留字母字符,一次性过滤所有非字母内容
            return !std::isalpha(c);
        }),
        plaintext.end() // 必须传入该参数,删除所有冗余无效字符
    );
    return plaintext;
}

内容的提问来源于stack exchange,提问作者Drift476

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 07:36:02