0
   #include <iostream>
    using namespace std;

    struct list
    {
        int data;
        list *next;
    };

    list *node, *tail = NULL, *head = NULL;
    void add2list();
    void extrem();

    int main()
    {
        add2list();
        extrem();

        return 0;
    }

    void add2list()
    {
        int input;
        cout << "Adding values to list :\n";
        cout << ">>";

        while(cin >> input)
        {
            node = new list;
            node->data = input;
            node->next = NULL;

            if (head == NULL)
            {
                head = node;
                tail = node;
            }
            else
             {
                tail->next = node;
                tail = node;
             }
        cout << ">>";
        }
    }

    void extrem()
    {
       int x, y;
       cin >> x >> y;
    }

当我运行这个程序时,它只执行 add2list 函数????

我添加了cin.clear(),但是问题没有解决,为什么??

有人可以清楚地解释我该如何解决这个问题

以及何时使用 cin.clear() 对象有用吗?

抱歉 4 我的英语不好

4

2 回答 2

2

你的逻辑被打破了:两者都cin >> input尝试cin >> x >> yint流中提取 s 。当while循环 add2list中断时,不再可能int从流中提取 s。重置错误标志不会突然使可解析数据出现在流中。当您尝试读入时x,您将再次失败,原因与您从循环中中断的原因相同。

您需要找到一种更好的方法来读取输入的不同部分,即一种用于构建列表,另一种用于读取更多数据。一般的基于的方法(通过std::getline)可能是一个好的开始,您可以实现一个简单的 shell,它接受诸如“创建列表”等命令。

于 2012-08-16T00:26:45.267 回答
0

std::cin >> value失败的原因有两个:

  1. std::cin已经结束(例如,使用 Ctrl-D 或 Ctrl-Z,取决于您使用的系统)
  2. 未决字符不能解析为value,即在您的情况下为int. 然而,有问题的字符没有被提取。

显然,在第一种情况下您无能为力:一旦到达标准输入流的末尾,就无法扩展它。因此,假设您输入了一个无效字符,例如一个字母。试图将这封信作为一个int将失败并导致std::ios_base::failbit被设置。在你可以对流做任何事情之前,你需要clear()它。清除后std::ios_base::failbit,您可以ignore()下一个字符,然后再试一次。也就是说,如果您在通话后添加add2list()以下两个电话,则应该没问题,假设只有一个违规字母(否则您可能需要忽略更多字符):

std::cin.clear();
std::cin.ignore();
于 2012-08-16T00:49:34.893 回答