cin>> val有时读取0取决于Ctrl-Z

时间:2015-10-05 08:44:54

标签: c++ windows mingw iostream

我试图使用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";
}

INPUT:42 42 42 12 13 13 ^Z(按Enter键)

输出:

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

但如果我在^Z之前按Enter键,那么它看起来像是:

INPUT:42 42 42 12 13 13(按Enter键)^Z(按回车键)

输出:

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

我想知道为什么我的代码中的变量val存储13,当我按下返回键后使用^Z键时,为什么它存储0如果我提供了^Z键以及我的输入。

2 个答案:

答案 0 :(得分:3)

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

  • 按一行开头的^Z设置文件结束条件
  • 在其他任何地方按^Z实际上会将ASCII 26字符发送到流

我也观察到:

  • cin >> valval设置为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中,从而避免了将读取失败设置为val0的行为}。

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

答案 1 :(得分:0)

查看差异

#include <iostream>
int main()
{
    int c_val = 0,val = 0,cnt = 1;
    std::cin>>c_val;
    int curr_val = 0;
    while(std::cin>>val){ // in case of no value cin will set val =0
        curr_val = val;
        if(curr_val == c_val)
            cnt++;
        else{
            std::cout<<c_val<<" occurs "<<cnt<< " times"<<std::endl;
            c_val = curr_val;
            cnt = 1;
        }
    }

    std::cout<<curr_val<<" occurs "<<cnt<<" times";
}