cin / cout被跳过

时间:2013-04-03 05:52:48

标签: c++ cout cin

我一直在编写一个示例程序来比较某些算法的运行时,这个问题一直给我带来麻烦。出于某种原因,cin / cout在整个程序的各个部分被随机跳过,我不完全确定为什么。这是代码,其中有违规行注释。 find_element已被注释掉以进行调试,但也不起作用。任何建议都会很棒!

#include <iostream>
#include <vector>

using namespace std;

void sort_vect( vector< int >& );
// int find_element( vector< int > );
void print_vect( vector< int > );

int main()
{
    vector< int > int_vect;
    int input;
    int result;

    char garbage;

    cout << "Enter a number into the vector (Q to quit) > ";

    while(cin >> input && input != 'Q' && input != 'q')
    {
        int_vect.push_back(input);
        cout << "> ";
    }

    // The following doesn't help
    // cin >> garbage;
    // cout << "Garbage : " << garbage << endl;

    if (int_vect.size() == 0)
    {
        cout << "Vector empty" << endl;
        return 1;
    }

    sort_vect(int_vect);
    print_vect(int_vect);

    cout << "What value do you want > ";
    cin >> input;   

    cout << "Result : " << int_vect[input-1] << endl;

    return 0;
} // main()

void sort_vect( vector< int >& int_vect)
{
    vector< int >::iterator vect_iterator;
    vector< int >::iterator temp_iterator;

    int temp_store = NULL;

    for(vect_iterator = int_vect.begin(); vect_iterator != int_vect.end(); vect_iterator++)
    {
        for (temp_iterator = vect_iterator; temp_iterator != int_vect.begin(); temp_iterator--)
        {
            while(*temp_iterator < *(temp_iterator-1))
            {
                temp_store = *temp_iterator;
                *temp_iterator = *(temp_iterator-1);
                *(temp_iterator-1) = temp_store;
            }
        }
    }

    cout << "Vector sorted." << endl << endl;
}

// int find_element( vector< int > int_vect)
// {
//  int input;
//  char garbage;
//  
//  cout << "Enter value to be returned (5 = 5th smallest) > ";
//  cin >> input;
//  cout << "Value for input : " << input << endl;
//      
//  return int_vect[input-1];
// }

void print_vect( vector< int > int_vect )
{
    vector< int >::iterator vect_iterator = int_vect.begin();

    while(vect_iterator != int_vect.end())
    {
        cout << *vect_iterator << endl;
        vect_iterator++;
    }
} // print_vect()

根据请求,输出(注意:输入错误,因为我忘记正确使用输入作为索引,但目前不是问题):

Enter a number into the vector (Q to quit) > 1
> 2
> 4
> 6
> 5
> 3
> 4
> q
Vector sorted.

1
2
3
4
4
5
6
What value do you want > Result : 4

1 个答案:

答案 0 :(得分:0)

您的代码跳过第二个输入的原因是因为您终止第一个输入循环的方式。

您的第一个循环终止不是因为您检测到用户已输入'q',而是因为'q'不是有效整数。任何字母'q','x','z'或任何字母都会阻止你的循环。

尝试从字母中读取整数会导致cin出错。一旦发生错误,cin将不会再读取任何内容,因此它会“跳过”剩余的输入。

要查看是这种情况,请尝试更改代码,以便输入-1退出,如此

cout << "Enter a number into the vector (-1 to quit) > ";

while(cin >> input && input >= 0)
{
    int_vect.push_back(input);
    cout << "> ";
}

现在您不再在cin中导致错误,因为所有内容都是整数,您的第二个输入现在可以正常工作。

要获得正确的解决方案,您需要查看我在评论中提出的建议。基本上,当您尝试读取整数和/或字母时,需要先读取一个字符串,然后再转换为整数。