【问题标题】:Array auto-filling itself in C++数组在 C++ 中自动填充
【发布时间】:2014-08-11 09:09:49
【问题描述】:

我正在学习 C++,做了一些简单的示例,并发现了这种奇怪的行为。 填充整数数组的元素时,如果任何元素设置为大于 2147483647(我相信这是最大整数值?),则数组中的其余元素设置为该确切数字,每个其中之一。

我知道如果一个元素超出其类型限制,编译器会将其限制在该限制内,但我不明白为什么它对其他项目做同样的事情,甚至没有要求用户填写它们。

这是我运行的一个简单测试:

#include <iostream>
using namespace std;

int main()
{
    int test[5];
    int num = 0;

    for (int i=0; i<5; i++)
    {
        cout << "Enter the number in position " << i << endl;
        cin >> num;
        test[i] = num;
    }

    cout << "Values in the array: " <<endl;
    for (int i=0; i<5; i++)
        cout << test[i] << endl;

}

感谢您的阅读、评论和帮助!

【问题讨论】:

  • 重复 ;) stackoverflow.com/questions/1065774/… 在这里你可以找到你的答案 :)
  • 对于以后的问题:请将输出和字符串翻译成英文,这样代码更容易理解。
  • @neptyd:这显然不是重复的
  • @iFreilicht 每当程序有任何西班牙语内容时,我都会将翻译作为行注释包含在内,即使这无关紧要。如果那是您指的...
  • 是的,我就是这个意思。它可能无关紧要(代码实际上并没有那么复杂),但现在更容易阅读。

标签: c++ arrays cin integer-overflow


【解决方案1】:

std::istream::operator&gt;&gt;的文档:

如果提取导致值太大或太小而无法放入value,则写入std::numeric_limits&lt;T&gt;::max()std::numeric_limits&lt;T&gt;::min() 并设置failbit 标志。

一旦设置了failbit 标志,后续的输入操作将不起作用,这意味着aux 保持不变。

转换失败后如果想继续提取物品,需要clearfailbit:

    cin.clear();
    cin >> aux;

【讨论】:

  • 谢谢,这正是我想要的,但我还不习惯文档。还要感谢编辑,现在问题似乎更清楚了!
  • 另外,在输入循环的每次迭代中清除输入缓冲区(包括 cin.clear())是一个好习惯吗? (例如,为了防止这种故障位问题)
  • @GDV 是的,没错——en.cppreference.com/w/cpp/io/basic_ios/clear 有一个示例,说明如何在循环中使用 clear
猜你喜欢
  • 1970-01-01
  • 2021-09-27
  • 1970-01-01
  • 1970-01-01
  • 2019-08-08
  • 1970-01-01
  • 2018-09-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多