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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 08:23:55