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
相关产品推荐
相关产品推荐

