如何在出现换行符之前将多个整数作为输入?

How can I take several integers as input until newline occurs?

本文关键字:整数 输入 换行符      更新时间:2023-10-16

我想将几个整数作为输入,直到换行符('',不是EOF(发生,然后将它们放入arrayvector中。如何使用C++独有的关键字来做到这一点?

以下是使用更多C++函数和数据结构的内容:

#include <string>
#include <sstream>
#include <iostream>
int main()
{
std::vector<int> database;
std::string text_line;
std::getline(std::cin, text_line);
std::istringstream input_stream(text_line);
int value;
while (input_stream >> value)
{
database.push_back(value);
}
// Edit 1: printing the vector
for (auto&& v:database)
{
std::cout << v << " ";
}
std::cout << "n";
return EXIT_SUCCESS;
}

在上面的程序中,一行文本(即直到换行符的文本(被读入字符串变量。

然后将字符串视为输入流,并将字符串中的所有数字放入向量中。

该字符串有助于限制仅从文本行输入的数字。

int main(){
std::vector<int> arr;
do {
int v;
char sep;
auto code = std::scanf("%d%c", &v, &sep);
if (code >= 1)
arr.push_back(v);
if (code < 2 || sep == 'n')
break;
} while(true);
for (auto&& v:arr)
std::printf("%d ", v);
}

我正在使用std::scanfstd::printf,因为问题是根据它们指定的,如果使用得当,它们是相当合理的io函数。 它们不是最安全的,所以我不会将它们用于真正的新项目中的全新代码,但我也会很想不使用cincout

使用基于 std::stream 的 IO 进行朴素替换将导致速度减慢 5 倍。 基于朴素行的分析会导致内存使用量增加 5 倍。

更小心的 std::stream 基于 IO 可以消除性能影响,如果您扫描整个程序,从不在整个运行过程中的任何地方再次使用printfscanf

但是,由于您根据scanf/printf指定了探测器,因此您必须通过读取如下文档来审核std::cin >> x如何解析整数:https://en.cppreference.com/w/cpp/locale/num_get/get

然后你必须确定(A(是否有任何区别,以及(B(这是否重要。 从文本流中读取整数充满了许多微小的复杂决策;除非非常小心,否则两个版本的行为不会完全相同。

(你把010当成8还是10? 你处理0xFF吗? 怎么样-0xFF? 3.2 是两个整数,由.分隔,还是在解析为整数时四舍五入的浮点数? 3,2 -- 这是作为小数分隔符的,吗? 哪些字符是空格,哪些不是? 您在哪里存储指示您所在区域设置的状态?

更新 C 代码的好C++应该替换从根本上损坏的 C 代码部分 - 比如固定大小的缓冲区 - 并且它向上。 除非绝对需要,否则它不应替换使用的低级别 IO 例程。

这就是我所做的。

如果你真的想使用cin,你能保证不检查输入:

t0x123 012 t33 n-3.-0x33n

会导致在scanfcin版本中加载相同的整数吗? 我个人不知道。

以下是我认为一个简单的C++等价物。它在功能上并不相同,但它显示了一般C++方式:

#include <iostream>
#include <vector>
int main(){
std::vector<int> arr;
int temp;
while(std::cin >> temp)
arr.push_back(temp);
for(auto i : arr)
std::cout << i << " ";
std::cout << 'n';
}

在这种情况下,输入必须以来自用户的EOF信号结尾。通常使用 CTRL+D(对于 *nix(或 CTRL+Z(对于 Windows(生成。