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

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

我想将几个整数作为输入,直到出现换行符('\n',不是EOF)然后将它们放入一个arrayvector。我如何使用 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::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.-0x33\n

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

这里使用了更多的 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)生成。