我想将几个整数作为输入,直到换行符('',不是EOF(发生,然后将它们放入array
或vector
中。如何使用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::scanf
和std::printf
,因为问题是根据它们指定的,如果使用得当,它们是相当合理的io函数。 它们不是最安全的,所以我不会将它们用于真正的新项目中的全新代码,但我也会很想不使用cin
和cout
。
使用基于 std::stream 的 IO 进行朴素替换将导致速度减慢 5 倍。 基于朴素行的分析会导致内存使用量增加 5 倍。
更小心的 std::stream 基于 IO 可以消除性能影响,如果您扫描整个程序,从不在整个运行过程中的任何地方再次使用printf
或scanf
。
但是,由于您根据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
会导致在scanf
和cin
版本中加载相同的整数吗? 我个人不知道。
以下是我认为一个简单的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(生成。