C++新手求助:统计字符串字符出现次数代码报错排查
问题解决:统计指定字符在字符串中的出现次数
原代码及错误信息
原代码
#include <iostream> #include <iomanip> using namespace std; int main() { string inputVal; string inputWord; int outputVal =0 ; cin >> inputVal; cout << inputVal; cin >> inputWord; cout << inputWord; for (int i=0; i <= inputWord.size(); ++i){ if (inputWord.at(i) == inputVal) { ++outputVal; } } if (outputVal ==1) { cout << outputVal << " " << inputVal<<endl; } else { cout << outputVal << " " << inputVal<<"'s" <<endl; } }
错误信息(翻译后)
main.cpp:16:20: 警告:有符号与无符号整数表达式比较:‘int’ 和 ‘std::__cxx11::basic_string<char>::size_type’(即‘long unsigned int’) [-Wsign-compare] main.cpp:17:25: 错误:‘operator==’ 不匹配(操作数类型为‘char’ 和 ‘std::string’)
错误分析与修正方案
1. 核心类型不匹配错误(编译报错)
需求是匹配单个字符,但代码中inputVal被定义为string类型,而inputWord.at(i)返回的是char类型,两种类型无法直接用==比较。
- 修正:将
inputVal的类型改为char,直接存储目标字符,贴合需求。
2. 循环越界与类型比较警告
inputWord.size()返回无符号整数类型,和int类型的循环变量i比较会触发有符号/无符号不匹配警告,可将i的类型改为size_t(string::size_type的标准别名)。- 循环条件
i <= inputWord.size()会导致越界:字符串索引范围是0到inputWord.size()-1,当i等于inputWord.size()时,inputWord.at(i)会触发越界异常,需改为i < inputWord.size()。
3. 代码规范补充
原代码未显式引入<string>头文件,虽然部分编译器会自动包含,但显式引入能保证代码在所有环境下正常编译。
修正后的代码
#include <iostream> #include <string> using namespace std; int main() { char inputVal; string inputWord; int outputVal = 0; cin >> inputVal; cout << inputVal << endl; cin >> inputWord; cout << inputWord << endl; for (size_t i = 0; i < inputWord.size(); ++i) { if (inputWord.at(i) == inputVal) { ++outputVal; } } if (outputVal == 1) { cout << outputVal << " '" << inputVal << "'" << endl; } else { cout << outputVal << " '" << inputVal << "'s" << endl; } return 0; }
内容的提问来源于stack exchange,提问作者Eleven
相关产品推荐
相关产品推荐

