cin对象 - c ++

时间:2012-08-16 00:17:46

标签: c++ cin

   #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我的英语不好

2 个答案:

答案 0 :(得分:2)

您的逻辑被破坏:cin >> inputcin >> x >> y都尝试从流中提取int。当while中的add2list循环中断时,无法再从流中提取int。重置错误标志不会突然使可解析数据出现在流中。当您尝试阅读x时,您将再次失败,原因与您从循环中断开的原因相同。

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

答案 1 :(得分:0)

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

  1. std::cin已达到目的(例如,使用Ctrl-D或Ctrl-Z,具体取决于您使用的系统)
  2. 待处理字符无法解析为value,例如int。但是,不提取违规字符。
  3. 显然,在第一种情况下你没有任何东西:一旦你到达标准输入流的末尾,就无法扩展它。所以,我们假设您输入了一个无效字符,例如一个字母。尝试将此字母作为int阅读将失败并导致设置std::ios_base::failbit。在您对流做任何事情之前,您需要clear()它。清除std::ios_base::failbit后,您可以ignore()下一个字符,然后重试。也就是说,如果你在通话后添加add2list(),那么下面两个调用应该没问题,假设只有一个违规字母(否则你可能需要忽略更多字符):

    std::cin.clear();
    std::cin.ignore();