如何使用isalpha函数去除C++字符串数组中的特殊字符与数字
C++ 词频统计程序isalpha清除特殊字符问题解决方案
原有代码核心问题
- 函数传参错误:
checkSpecialCharacters采用值传递,修改的是形参副本,不会作用到原单词字符串 - 参数逻辑错误:处理单个单词时错误传入了整个单词数组的长度作为遍历上限,没有使用当前单词自身的长度
- 判定逻辑颠倒:代码中判断
isalpha为真时执行删除操作,反而删掉了合法的字母字符,应该删除非字母的内容 - 头文件错误:引入了不存在的
<stream>头,应该改为<fstream>才能正常使用文件流 - 删除逻辑错误:原有两层循环的删除逻辑完全不符合字符串单字符过滤的需求,会出现越界访问问题
修正方案
- 修正头文件引用,将
#include <stream>改为#include <fstream> - 修改
checkSpecialCharacters函数声明,改为传引用且不需要额外传入size参数:
void checkSpecialCharacters(string &word);
- 重写
checkSpecialCharacters函数实现,基于isalpha过滤非字母字符:
void checkSpecialCharacters(string &word) { string filteredWord; for (char c : word) { // isalpha参数转unsigned char避免传入负字符触发未定义行为 if (isalpha(static_cast<unsigned char>(c))) { filteredWord += c; } } word = filteredWord; }
如果允许使用STL算法,也可以用更简洁的erase-remove_if写法:
void checkSpecialCharacters(string &word) { word.erase(remove_if(word.begin(), word.end(), [](char c) { return !isalpha(static_cast<unsigned char>(c)); }), word.end()); }
- 修改调用处的代码,将原调用语句
checkSpecialCharacters(wordPtr[i], size);改为checkSpecialCharacters(wordPtr[i]);
额外优化建议
过滤完成后可以加判断,如果处理后单词为空(比如原内容全是符号数字),可以跳过存入数组的步骤,避免最后统计出现空字符串的词频。
内容的提问来源于stack exchange,提问作者AbuDavid
相关产品推荐
相关产品推荐

