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

C++如何校验字符串字符是否为字母 逐次移除数字并输出各阶段结果

C++ 逐次移除字符串中数字并输出中间结果实现方案

现有代码的核心错误

  • 循环越界:C++字符串下标从0开始,有效下标范围为0 ~ length()-1,原有循环条件q<=(userText.length())会访问到不存在的下标,触发运行时错误
  • 索引迭代错误:for循环本身已经自带q++逻辑,分支内额外写的q++会导致每次循环跳过1个字符,漏检内容
  • 输出逻辑错误:需求要求仅在完成一次数字移除后输出当前字符串,且需要先输出原始输入串,原有代码遇到字母也会输出,不符合要求
  • 逻辑冗余:不需要嵌套for循环,利用string::erase的特性(删除指定位置字符后,后续字符会自动前移补位),单循环即可实现需求

实现思路

  1. 读取用户输入后,首先输出原始字符串,对应示例第一行输出
  2. 从下标0开始遍历字符串:
    • 若当前位置是数字,删除该位置字符,立刻输出当前字符串;删除后当前下标不需要自增,因为后续字符已经自动前移到当前下标位置,下一轮循环直接检查该位置即可
    • 若当前位置不是数字,下标自增,检查下一个字符
  3. 注意:isdigit/isalpha等字符判断函数需要传入unsigned char类型值,直接传入char类型在字符为负值时会触发未定义行为

修正后可运行代码

#include <iostream>
#include <string>
#include <cctype>

using namespace std;

int main() {
    string userText;
    cout << "Enter some text:";
    // 若此前没有通过cin读取过其他类型输入,不需要调用cin.ignore(),否则会吞掉输入的首字符
    getline(cin, userText);
    system("clear");

    // 输出原始字符串
    cout << userText << endl;

    int q = 0;
    while (q < userText.size()) {
        if (isdigit(static_cast<unsigned char>(userText[q]))) {
            userText.erase(q, 1);
            cout << userText << endl;
            // 移除数字后下标不自增,检查前移到当前位置的新字符
        } else {
            q++;
        }
    }

    return 0;
}

测试效果

输入1hello22时,输出完全匹配预期:

1hello22
hello22
hello2
hello

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 13:09:16