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

C++读取N后读N个整数,统计末位值此前出现次数及段错误解决

C++统计序列末尾元素前置出现次数问题解决

问题需求

编写程序读取非空整数序列,统计其中与最后一个数值相等的元素个数,要求排除最后一个元素本身,仅统计它在序列前面部分的出现次数。

输入示例

9
1 7 3 2 4 7 5 8 7

对应输出

2

问题表现

初始代码运行时,读取整数N后直接报Segmentation fault (core dumped)错误。

初始错误代码

#include <iostream>
#include <vector>
#include <sstream>

int NumbersEqualToLast(int limit, std::vector<int> elements) {
  int check = elements[limit], counter = 0;
  for (int i = limit; i >= 0; i--) {
    if (elements[i] == check) {
      counter++;
    }
  }
  return(counter);
}

int main() {
  int amount, number;
  std::cin >> amount;

  std::string input;
  getline(std::cin, input);
  std::stringstream iss(input);
  std::vector<int> numbers;
  while ( iss >> number ) {
    numbers.push_back( number );
  }
  std::cout << NumbersEqualToLast(amount, numbers) << std::endl;
} 

错误原因

  • 输入读取逻辑异常:std::cin >> amount读取完数量后,输入缓冲区残留换行符,后续getline只会读取到空字符串,最终numbers容器的大小远小于输入的amount值
  • 数组下标越界:C++ vector下标从0开始,长度为limit的vector最大合法下标是limit-1,初始代码直接访问elements[limit]属于越界访问,直接触发段错误
  • 统计逻辑不符合需求:初始循环从下标limit开始,会把最后一个元素本身也计入统计,不符合排除最后一个元素的规则

修复后可运行代码

#include <iostream>
#include <vector>

int NumbersEqualToLast(int limit, std::vector<int> elements) {
  int check = elements[limit - 1], counter = 0;
  for (int i = limit - 2; i >= 0; i--) {
    if (elements[i] == check) {
      counter++;
    }
  }
  return(counter);
}

int main() {
  int quantity;
  std::cin >> quantity;
  int number;
  std::vector<int> numbers;
  for (int i = 0; i < quantity; i++) {
    std::cin>>number;
    numbers.push_back(number);
  }
  std::cout << NumbersEqualToLast(quantity, numbers) << std::endl;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 09:15:04