无限循环与| operator c ++

时间:2018-02-01 23:57:01

标签: c++ while-loop infinite

我正在使用C ++进行Bjarne Stroustrup的原则和实践,并且我坚持一个特定的练习。确切的问题是:

  

"编写一个由while循环组成的程序(每次循环)读入两个整数然后打印它们。终止' |'输入。"

我认为下面的代码可以正常工作,但我一直在做一个永无止境的循环。

#include <iostream>

int main() {
  int i1 = 0;
  int i2 = 0;

  while ((i1 != '|') || (i2 != '|')) {
    std::cout << "Enter some nums YO (enter | to exit)\n";
    std::cin >> i1 >> i2;
    std::cout << i1 << i2;
  }

}

4 个答案:

答案 0 :(得分:1)

std::cin >> i1 >> i2;

告诉程序读取两个整数,因此程序在流中查找数字。如果输入“|”,则无法找到数字,并且流将进入故障状态。可以接受失败状态will need to be cleared和更多输入之前bad input ignoreed的剩余部分。但是如果你为字符“|”加上数字编码(124假设ASCII编码),流输入和条件都将被满足,但现在不可能输入数字124和平均值124而不是'|'。

而是阅读std::string s。如果两个字符串都不是“|”,请测试字符串是否为整数(可能是尝试将它们转换为integers with std::stoi)。如果找到“|”,则退出循环。

MSalter的评论震撼了另一个比转到string更简单的解决方案。如果读取了2个数字,则打印数字并要求更多。否则,清除读取非整数的错误并读入char以测试“|”。这是一个非常简单和丑陋的剪辑:

#include <iostream>

int main()
{
    int i1 = 0;
    int i2 = 0;
    char ch = ' '; // can be anything but |
    do
    {
        std::cout << "Enter some nums YO (enter | to exit)\n";
        if (std::cin >> i1 >> i2) 
        { // we got nums, YO.
            std::cout << i1 << i2; // print the nums, YO
        }
        else
        { // not nums, YO. Let's see if we got a |
            std::cin.clear(); // clear the error
            std::cin >> ch; //read for a '|'
        }
    } while (ch != '|' && std::cin); // loop until | is read or cin can't read a char
}

这很难看,因为像“auoaioafksdjnfkm”这样的输入会打印出每个角色的提示,而“klasdjfahs12938 2093854sjfljzlkfjzlk”会打印出过多的提示,并在中间某处打印出“129382093854”。

答案 1 :(得分:0)

int存储一个数字。 '|'是一个字符,然后使用char来读取/存储它。

char i1;
char i2;

示例:

int main() {

    char i1;
    char i2;

    while ((i1 != '|') || (i2 != '|')) {
        std::cout << "Enter some CHARACTERS (enter '|' to exit)\n";
        std::cin >> i1 >> i2;
        std::cout << i1 << i2;
    }
}

答案 2 :(得分:0)

循环继续,因为你在整数变量和字符值

之间进行比较
while(i1!='|'||i2!='|)//does not work

因为i1和i2只能拥有数字值(0123456789)而不是charactes(a,b,c,!,ª,|)i1和i2永远不能取值'|'并且循环一遍又一遍地运行。 一件事应该有效:

    int main() {
  int i1 = 0;
  int i2 = 0;
  char c;//declare c
  while (c!='|') {//if the value of c is not equal to '|' run the loop
    cout << "Enter some 2 nums and a character YO (enter | to exit)\n";
    cin >> i1 >> i2 >> c;//give a value to i1,i2 & c
    cout << i1 << i2;
}

}

答案 3 :(得分:0)

从控制台读取一行文字。如果该行包含|,则退出。否则,解析该行。

int main()
{
    for (;;)
    {
        std::cout << "Enter some nums YO (enter | to exit)" << std::endl;
        std::string s;
        std::getline(cin, s);
        if (s.find('|') != s.npos)
        {
            break;
        }
        std::istringstream ss(s);
        int i1, i2;
        ss >> i1 >> i2;
        std::cout << i1 << ' ' << i2 << std::endl;
    }
    return 0;
}