gpt4 book ai didi

c++ - 总结一串数字输入的最佳方法

转载 作者:太空宇宙 更新时间:2023-11-04 15:13:33 25 4
gpt4 key购买 nike

问题

目前我正在查看 HackerRank 上的一个问题,其中输入的格式为:

4 
6 7 8 9

基本上第一行指定输入整数的数量,第二行指定后面的所有整数。看起来很简单,但不确定为什么我的程序不工作。

我的解决方案

#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <string>
#include <algorithm>

int main(){

int n;
std::cin >> n;

// Get all the numbers
std::string rawInput;
std::cout << "we have reached here 1";
std::cin >> rawInput;
std::cout << "we have reached here 2";
std::vector<std::string> numbers;
std::string number = "";
for (int i = 0; i < rawInput.size(); i++) {
char c = rawInput[i];
if (c == ' ') {
numbers.push_back(number);
}
number += c;
}

// Get all the ints
int sum = 0;
std::cout << sum;
for (int j = 0; j < n; j++) {
sum += stoi(numbers[j]);
}

std::cout << sum;

return 0;
}

错误

现在我没有看到调试 cout行:std::cout << "we have reached here 2"; .我不确定为什么会这样。

调试器输出

DB trace:
Reading symbols from solution...done.
[New LWP 18595]
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Core was generated by `solution'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0 0x0000000000401042 in __gnu_cxx::__stoa<long, int, char, int> (
__idx=<optimized out>, __str=<optimized out>, __name=<optimized out>,
__convf=<optimized out>) at /usr/include/c++/6/ext/string_conversions.h:68
68 const _TRet __tmp = __convf(__str, &__endptr, __base...);
#0 0x0000000000401042 in __gnu_cxx::__stoa<long, int, char, int> (
__idx=<optimized out>, __str=<optimized out>, __name=<optimized out>,
__convf=<optimized out>) at /usr/include/c++/6/ext/string_conversions.h:68
#1 std::__cxx11::stoi (__base=10, __idx=0x0, __str=...)
at /usr/include/c++/6/bits/basic_string.h:5414
#2 main () at solution.cc:32

最佳答案

崩溃的直接原因是假设n是正确的。您从未在代码中确认过它,但在遍历 numbers 时继续使用它。然后,您会超出 numbers 并导致 stoi 爆炸。

事实上,n 不是 4!它只有 1,因为您的第二行输入已损坏。只需打印出 rawInput 的值,您就会看到。

要读取 6 7 8 9 行,您需要 std::getline(std::cin, rawInput)。格式化提取到 std::string(您现在正在使用)只会提取第一个“ token ”;即,只有 6

但是,当切换到 std::getline 时,您现在需要拓扑排序答案中探索的换行跳过滑稽 Action ,因为非格式化提取不会跳过空格以同样的方式。

最后,在将 number 添加到 vector 之后,您永远不会清除它,也永远不会处理最终值。

我还建议在输出语句的末尾添加一些换行符。

这是一个固定的程序:

#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <string>
#include <algorithm>

int main(){

int n;
std::cin >> n;

// Get all the numbers
std::string rawInput;
std::cin.ignore(256,'\n');
std::getline(std::cin, rawInput);

std::vector<std::string> numbers;
std::string number = "";
for (size_t i = 0; i < rawInput.size(); i++) {
char c = rawInput[i];
if (c == ' ') {
numbers.push_back(number);
number = "";
}
number += c;
}

// One more! If there wasn't a space at the end of it.
if (!number.empty())
numbers.push_back(number);

// Get all the ints
int sum = 0;
for (size_t j = 0; j < numbers.size(); j++) {
sum += stoi(numbers[j]);
}

std::cout << sum << '\n';
}

( live demo )


我实际上建议始终坚持使用格式化提取,这要简单得多:

#include <vector>
#include <iostream>
#include <numeric>
#include <algorithm>
int main()
{
int n;
std::cin >> n;

// Get all the numbers
std::vector<int> numbers;
int temp;
while (std::cin >> temp)
numbers.push_back(temp);

const int sum = std::accumulate(numbers.begin(), numbers.end(), 0);
std::cout << sum << '\n';
}

请注意,我们不再需要 n 了!但是,如果您想人为地将提取限制为仅 n 个数字,您可以在 while 循环中执行此操作。

( live demo )

关于c++ - 总结一串数字输入的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43763817/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com