在出现换行符之前,如何将多个整数作为输入?
How can I take several integers as input until newline occurs?
我想将几个整数作为输入,直到出现换行符('\n',不是EOF)然后将它们放入一个array
或 vector
。我如何使用 C++ 独有的关键字来做到这一点?
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.-0x33\n
会导致在 scanf
和 cin
版本中加载相同的整数吗?我个人不知道。
这里使用了更多的 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;
}
在上面的程序中,一行文本(即直到换行符的文本)被读入字符串变量。
然后将字符串视为输入流,并将字符串中的所有数字放入向量中。
字符串有助于限制为仅从文本行输入的数字。
这是我认为的简单 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 signal 结尾。通常使用 CTRL+D(对于 *nix)或 CTRL+Z(对于 Windows)生成。
我想将几个整数作为输入,直到出现换行符('\n',不是EOF)然后将它们放入一个array
或 vector
。我如何使用 C++ 独有的关键字来做到这一点?
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.-0x33\n
会导致在 scanf
和 cin
版本中加载相同的整数吗?我个人不知道。
这里使用了更多的 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;
}
在上面的程序中,一行文本(即直到换行符的文本)被读入字符串变量。
然后将字符串视为输入流,并将字符串中的所有数字放入向量中。
字符串有助于限制为仅从文本行输入的数字。
这是我认为的简单 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 signal 结尾。通常使用 CTRL+D(对于 *nix)或 CTRL+Z(对于 Windows)生成。