当' |'为什么这段代码会导致无限循环?是用C ++输入的?

时间:2018-03-15 03:49:00

标签: c++ loops cin

我正在阅读编程:使用C ++的原理和实践(第2版)
我发现了这个问题:

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

以下是我尝试的内容:

ExpressionAttributeNames

当' |'输入后,它会输出无限循环,意外输出等内容。

  • 那里发生了什么?
  • 我做错了什么?

3 个答案:

答案 0 :(得分:5)

首先,您尚未将xy设置为任何内容,然后再将其与'|'循环中的while进行比较。这意味着它们可能具有任意值,并且您的循环甚至可能无法启动。

至于为什么你看到一个无限循环,因为变量的类型为intcin >> something会尝试翻译你输入的字符转入整数并将其放入变量。

如果这些字符的初始序列形成有效整数(例如,它是|字符),则cin >>将失败,变量将保持不变,输入流将保持原样。

所以,当你再次来到下一个整数时,输入流中的| 仍然是,并且会再次发生完全相同的事情,无限 - 请注意两者之间的相似性拉丁短语和你的问题标题: - )

你可以做些什么来解决这个问题,尝试逐个字符地查看你是否在流中有|。如果是这样,请退出。如果没有,请尝试使用正常的if (stream >> variable)方法获得两个整数。

可以使用cin.peek()检查下一个字符,然后cin.get()删除字符。您还必须考虑到peekget都不会像operator>>那样跳过空格的事实。

这样的事情应该是一个好的开始:

#include <iostream>
#include <cctype>

int main() {
    int x, y;

    while (true) {
        // Skip all white space to (hopefully) get to number or '|'.

        while (std::isspace(std::cin.peek())) std::cin.get();

        // If it's '|', just exit, your input is done.

        if (std::cin.peek() == '|') break;

        // Otherwise, try to get two integers, fail and stop if no good.

        if (! (std::cin >> x >> y)) {
            std::cout << "Invalid input, not two integers\n";
            break;
        }

        // Print the integers and carry on.

        std::cout << "You entered " << x << " and " << y << "\n";
    }

    return 0;
}

使用各种测试数据表明它涵盖了所有案例(我能想到的):

pax$ ./myprog </dev/null
Invalid input, not two integers

pax$ echo hello | ./myprog
Invalid input, not two integers

pax$ echo 1 | ./myprog
Invalid input, not two integers

pax$ echo 1 2 | ./myprog
You entered 1 and 2
Invalid input, not two integers

pax$ printf '1 2|' | ./myprog
You entered 1 and 2

pax$ printf '1 2\n3 4\n5     6 7   8   \n|' | ./myprog
You entered 1 and 2
You entered 3 and 4
You entered 5 and 6
You entered 7 and 8

pax$ printf '1 10     11   12   13    14    |   ' | ./myprog
You entered 1 and 10
You entered 11 and 12
You entered 13 and 14

答案 1 :(得分:3)

正如人们在paxdiablo的评论和答案中所指出的那样,你们两个变量都是未初始化的,你们正在尝试输入一个int,然后将它与一个char进行比较。

我们可以使用cin.peek()来查看下一个字符并检查它是否是&#39; |&#39;而不是尝试将输入的int与char进行比较。在阅读之前。

#include <iostream>
int main()
{
    int x, y;
    while(std::cin.peek() != '|') //cin.peek() will return the next character to be read
    {
        std::cin >> x >> y;
        std::cout << x << ' ' << y << '\n';
        std::cin.ignore(); //ignore whitespace/linebreak character left by extraction (>> operator)
    }
}

答案 2 :(得分:-1)

因为您将x,y定义为整数,但您输入的输入为char。 试试这段代码

#include <iostream>
using namespace std;
int main ()
{
    char x=NULL, y=NULL;
    while (x != '|' || y != '|')
    {
        cin >> x;
        cin >> y;
        cout << x << endl;
        cout << y << endl;
    }

    return 0;
}

但它也有局限性。您只能将输入作为单个数字。如果您想要大量数字,请尝试这个

#include <iostream>
using namespace std;
int main ()
{
    string  x="", y="";
    while (x != "|" || y != "|")
    {
        cin >> x;
        cin >> y;
        cout << x << endl;
        cout << y << endl;
    }

    return 0;
}