【发布时间】:2022-01-02 23:42:06
【问题描述】:
我正在做一个任务,我需要创建一个程序来读取一个非空的整数序列,并告诉其中有多少等于最后一个。
它应该读取序列的整数数量,然后读取序列本身并返回最后一个数字重复自身的次数,不包括最后一个。
输入会是这样的:
9
1 7 3 2 4 7 5 8 7
输出应该是:
2
现在,我对程序的功能没有任何问题,但我正在努力让它读取输入。这是我得到的:
#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;
}
问题是在读取整数的数量(在本例中为 9)后,我收到了 Segmentation fault (core dumped) 错误。
解决后编辑
这就是使用您的建议对我有用的方法。谢谢你。 我知道它是否不漂亮或者有更好更有效的方法,但我才刚刚开始。 :)
#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;
}
【问题讨论】:
-
您的问题是关于如何在循环中读取 N 个值。您的问题描述了 循环之后发生的事情(很可能在您未显示的函数中)。为了解决标题中的问题,当向量达到该大小时,您将停止读取值。在循环之后,您应该确保您 确实 实际上读取了足够的值。作为一种好的做法,您应该在将已知数量的数据推送到向量之前保留存储空间:例如
numbers.reserve(amount); -
现在您已经更新了问题,我们可以看到
elements[limit]超出范围。最后一个元素位于索引limit - 1。或者您可以使用elements.back()。顺便说一句,养成通过引用将向量传递给函数而不是复制它们的习惯。 -
在现实世界中,这将通过
std::count完成。 -
std::count(numbers.begin(), numbers.end(), numbers.back()) - 1;-- 停止编写循环并学习算法函数。基本上是一条线的解决方案。
标签: c++ string vector segmentation-fault getline