当前位置:  开发笔记 > 编程语言 > 正文

c ++中的无限循环

如何解决《c++中的无限循环》经验,为你挑选了2个好方法。

我正在学习C++并编写一些程序.以下是一个这样的程序:

// This program is intended to take any integer and convert to the
// corresponding signed char.

#include 

int main()
{
  signed char sch = 0;
  int n = 0;
  while(true){
    std::cin >> n;
    sch = n;
    std::cout << n << " --> " << sch << std::endl;
  }
}

当我运行此程序并将输入保持在相当小的绝对值时,它的行为与预期的一样.但是当我输入更大的输入时,例如10000000000,程序会重复地输出相同的输出.某些输入组合会导致不稳定的行为.例如:

#: ./int2ch
10
10 --> 

10000000000
10 -->

10 -->

10 -->

10 -->

程序吐出"10 - >"直到它被杀死.(使用这个特定的输入序列,程序的输出变化速度不稳定.)我还注意到,大值的输出由先前的合法输入以及当前非法输入的值决定.

这是怎么回事?(我不关心修复程序,这很容易.我想了解它.)



1> Evan Teran..:

基本上您的cin流处于失败状态,因此当您尝试读取它时会立即返回.像这样重写你的例子:

#include 

int main()
{
  signed char sch = 0;
  int n = 0;
  while(std::cin >> n){
    sch = n;
    std::cout << n << " --> " << sch << std::endl;
  }
}

cin >> n将返回一个引用cin,您可以在条件中测试"good-ness".所以基本上" while(std::cin >> n)"是说"虽然我仍然可以成功读取标准输入,但请执行以下操作"

编辑:它重复输出输入的最后一个好值的原因是因为那是n中成功读取的最后一个值,失败的读取不会改变n的值

编辑:如评论中所述,您可以清除错误状态,并再次尝试这样的事情可能会工作,只是忽略错误的数字:

#include 
#include 

int main() {
    signed char sch = 0;
    int n = 0;
    while(true) {
        if(std::cin >> n) {
            sch = n;
            std::cout << n << " --> " << sch << std::endl;
        } else {
            std::cin.clear(); // clear error state
            std::cin.ignore(INT_MAX, '\n'); // ignore this line we couldn't read it
        }
    }
}



2> Johannes Sch..:

是的,Evan Teran已经指出了大部分事情.我想添加的一件事(因为我无法评论他的评论:))是你必须在调用istream :: ignore 之前调用istream :: clear .原因是如果流仍处于失败状态,istream :: ignore同样会拒绝执行任何操作.

推荐阅读
mobiledu2402851173
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有