解析大整数输入时 C++ 输入/输出中的奇怪行为

问题描述 投票:0回答:2

我有以下代码:

#include <iostream>
using namespace std;

int main() {
  // Number of inputs
  int N;
  scanf("%d", &N);
  // Takes in input and simply outputs the step it's on
  for (int i = 0; i < N; i++) {
    int Temp;
    scanf("%d", &Temp);
    printf("%d ", i);
  }
}

当接受大量整数输入时,C++ 在打印输出的某个点处停止,似乎在等待更多输入的到来。 给定 2049 个 1 的输入,程序在打印 2048 个整数(0 到 2047)后停止,并且不打印最后的 2048 个(第 2049 个整数)。 2048 看起来很可疑,因为它是 2 的幂。 似乎输入值越大,程序决定停止的速度就越快,在这种情况下,在看起来像是随机数量的步骤之后。例如,我给它991个整数(最多一万个),程序在迭代724后停止输出。 请注意,我将数字作为一个整体复制并粘贴,而不是逐个键入并输入它们,但我怀疑这是否起作用。我也尝试过 cin 和 cout,但它们没有帮助。 有人可以解释一下这种现象背后的原因吗?

c++ input io numbers output
2个回答
2
投票

我找到了问题的答案。正如许多人所建议的那样,失败背后的原因确实是由于复制和粘贴大量输入造成的,我感谢大家的帮助。不过,没有不正确的字符,而导致此问题的原因是规范模式带来的 4096 个字符限制。

在规范模式下,终端允许用户使用箭头键、退格键等导航输入。仅当存在换行符或缓冲区已满时,它才会将文本发送到处理器。该缓冲区的大小为 4096 个字符,很明显为什么代码无法解析比这更多的输入,即 2049

"1 "
s 是 4098 个字符。人们可以使用
stty -icanon
切换到非规范模式,该模式允许更大的输入,但代价是无法导航。输入
stty icanon
可返回规范模式。

实际上,用换行符分隔数字似乎是最简单的解决方法。

这个来源对我很有帮助:http://blog.chaitanya.im/4096-limit。 这篇关于unix堆栈交换的文章与我的问题类似:https://unix.stackexchange.com/questions/131105/how-to-read-over-4k-input-without-new-lines-on-a-terminal .


-1
投票

我的第一个想法是你在输入方面遇到了某种障碍......

命令行长度的限制[通常]不是由 shell 施加的,而是由操作系统施加的。

Bash 命令行和输入限制 - SO

然而,情况可能并非如此。

首先,关注您的数据,确保您的数据是您所认为的那样(没有意外字符),然后尝试调试您的读取,确保这些值按照您的预期进入内存。

尝试将读取和写入分成两个循环,这可能会帮助您更轻松地进行调试,具体取决于您的技能水平,但再次确保您的读取不会发生奇怪的事情。阅读此文后,怀疑度很高......

下面有一些裂缝......尚未测试。希望这有帮助!

#include <iostream>

int main() {
  int N;
  std::cin >> N;

  // Read N integers, storing to array
  int* numbers = new int[N];
  for (int i = 0; i < N; i++) {
    std::cin >> numbers[i];
  }

  for (int i = 0; i < N; i++) {
    std::cout << numbers[i] << " ";
  }
  std::cout << std::endl;

  delete[] numbers;

  return 0;
}

好吧...也许更优化一点...

#include <iostream>

int main() {

  int N;
  std::cin >> N;

  // fixed-size on the stack
  int* numbers = new int[N];

  // cin.tie(nullptr) and ios::sync_with_stdio(false) might improve perf.
  std::cin.tie(nullptr);
  std::ios::sync_with_stdio(false);

  // Read N integers, storing to array
  for (int i = 0; i < N; i++) {
    std::cin >> numbers[i];
  }

  for (int i = 0; i < N; i++) {
    std::cout << numbers[i] << " ";
  }
  std::cout << std::endl;

  delete[] numbers;

  return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.