C++如何校验字符串字符是否为字母 逐次移除数字并输出各阶段结果
C++ 逐次移除字符串中数字并输出中间结果实现方案
现有代码的核心错误
- 循环越界:C++字符串下标从0开始,有效下标范围为
0 ~ length()-1,原有循环条件q<=(userText.length())会访问到不存在的下标,触发运行时错误 - 索引迭代错误:for循环本身已经自带
q++逻辑,分支内额外写的q++会导致每次循环跳过1个字符,漏检内容 - 输出逻辑错误:需求要求仅在完成一次数字移除后输出当前字符串,且需要先输出原始输入串,原有代码遇到字母也会输出,不符合要求
- 逻辑冗余:不需要嵌套for循环,利用
string::erase的特性(删除指定位置字符后,后续字符会自动前移补位),单循环即可实现需求
实现思路
- 读取用户输入后,首先输出原始字符串,对应示例第一行输出
- 从下标0开始遍历字符串:
- 若当前位置是数字,删除该位置字符,立刻输出当前字符串;删除后当前下标不需要自增,因为后续字符已经自动前移到当前下标位置,下一轮循环直接检查该位置即可
- 若当前位置不是数字,下标自增,检查下一个字符
- 注意:
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
相关产品推荐
相关产品推荐

