gpt4 book ai didi

c++ - cin >> val 有时会读取 0,具体取决于 Ctrl-Z

转载 作者:可可西里 更新时间:2023-11-01 09:23:56 24 4
gpt4 key购买 nike

我尝试使用 MinGW 编译器在 Windows 中用 C++ 编写代码,我的代码计算并打印给定输入集中某个数字出现的连续 次的次数。代码如下:

#include <iostream>
int main()
{
int c_val = 0,val = 0,cnt = 1;
std::cin>>c_val;
while(std::cin>>val){
if(val==c_val)
cnt++;
else{
std::cout<<c_val<<" occurs "<<cnt<< " times"<<std::endl;
c_val = val;
cnt = 1;
}
}
std::cout<<val<<" occurs "<<cnt<<" times";
}

输入:42 42 42 12 13 13 ^Z(按 Enter)

输出:

42 occurs 3 times
12 occurs 1 times
0 occurs 2 times

但是如果我在 ^Z 之前按 Enter 则它看起来像:

输入:42 42 42 12 13 13(按回车)^Z(按回车)

输出:

42 occurs 3 times
12 occurs 1 times
13 occurs 2 times

我想知道为什么我的代码中的变量 val 存储 13,当我在按下返回键后使用 ^Z 键并且如果我输入 ^Z 键,为什么它会存储 0

最佳答案

事情是这样的。我使用 MinGW-w64 4.9.2 观察到了这一点。无论是在 Windows 控制台中还是在 Cygwin(但不使用 cygwin-mingw)下运行可执行文件,其行为都是相同的。

  • 在行首按 ^Z 设置文件结束条件
  • 在其他任何地方按 ^Z 实际上会向流发送 ASCII 26 字符

我还观察到:

  • cin >> val 如果由于输入不包含数字而失败,则将 val 设置为 0
  • cin >> val 如果输入因文件结束而失败,则 val 保持不变。

根据 this thread这是 C++11 指定的正确行为。

因此您的结果可以得到解释。当您输入 42 42 42 12 13 13^Z 时,就好像您输入了 42 42 42 12 13 13x 一样。读取前六个数字,然后当遇到 x 时,cin >> val 失败并将 val 设置为 0.

但是,当您按 Enter 然后按 ^Z 时,就好像您正在从文件中读取数据并到达了文件末尾。 cin >> val 保持 val 不变,它仍然保持上次成功 cin >> val 后的值。

如果您按照 Gautam Jha 的建议进行更改,那么在这两种情况下您都将获得 13。这是因为他有效地读入了一个临时int,然后只有在读取成功时才将临时int存储到真正的val中,从而避免了读取失败设置val的行为> 到 0

这可能是期望的行为,尽管您可能还想检查 cnt > 0 以避免在完全空输入的情况下出现奇怪的输出。

关于c++ - cin >> val 有时会读取 0,具体取决于 Ctrl-Z,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32944448/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com