程序正在跳过Getline()而不接受用户输入

时间:2010-09-16 23:05:36

标签: c++ iostream getline

这是一个非常奇怪的问题,当我的程序询问用户的地址,而不是等待输入时,它似乎完全跳过了getline()函数

Answerinput:

cout << "would you like to add another entry to the archive? (Y/N):";

cin >> answer;

cout << endl;
cout << endl;

answer = toupper(answer);


 switch(answer)
    {
    case 'Y':
        Entrynumber++;

        cout << "began record number " << Entrynumber << "+ 1." << endl;

        cout << "Enter the last name of the person to be entered" << endl;

        cin >> stringentry;
        cout << endl;

        stringlength = stringentry.length();

        strcpy(Record[Entrynumber].Last_Name, stringentry.c_str());


        Record[Entrynumber].Last_Name[stringlength] = '*';



        cout << "Enter the first name of the person" << endl;

        cin >> stringentry;
        cout << endl;

        stringlength = stringentry.length();

        strcpy(Record[Entrynumber].First_Name, stringentry.c_str());

        Record[Entrynumber].First_Name[stringlength] = '*';

        cout << "Enter the SSN of the person" << endl;
        cin >> Record[Entrynumber].SSN;
        cout << endl;

        cout << "Enter the age of the person" << endl;
        cin >> Record[Entrynumber].Age;
        cout << endl;

        cout << "Enter the address of the person" << endl;


        cin.getline(Record[Entrynumber].Address,70);


        cout << endl;


        stringentry = Record[Entrynumber].Address;

        stringlength = stringentry.length();



        Record[Entrynumber].Address[stringlength] = '*';

        cout << "you entered:" << endl;



        for(jim = 0 ; Record[Entrynumber].Last_Name[jim + 1] != '*' ; jim++)
        {
            cout << Record[Entrynumber].Last_Name[jim];
        }

        cout << ',' ;


        for(jim = 0 ; Record[Entrynumber].First_Name[jim + 1] != '*' ; jim++)
        {
            cout << Record[Entrynumber].First_Name[jim];
        }

        cout << endl;

        cout << Record[Entrynumber].SSN << endl;
        cout << Record[Entrynumber].Age << endl;

        for(jim = 0 ; Record[Entrynumber].Address[jim + 1] != '*' ; jim++)
        {
            cout << Record[Entrynumber].Address[jim];
        }
        cout << endl;
        cout << endl;


        goto Answerinput;
    case 'N':
        cout << "ok" << endl;
        break;
    default:
        cout << "invalid answer" << endl;
        goto Answerinput;
    }

输出到控制台

would you like to add another entry to
the archive? (Y/N):Y

began record number 6+ 1. 


 Enter the last name of the person to be entered 
 John


 Enter the first name of the person 
 John

 Enter the SSN of the person  22222222

 Enter the age of the person  22

 Enter the address of the person

 you entered: 
Joh,Joh 
22222222 
22
 *¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
 //////////////22 more lines of'|'//////////////////////////////////////////////
 ... 
¦¦¦¦¦¦¦¦l3-j

 would you like to add another entry to the archive? (Y/N):

cin.getline()和getline()都做同样的事情。

我正在使用MVC ++ 2008。

Record数组中的所有字段都是结构,Record [Entrynumber] .Address是一个char数组。

2 个答案:

答案 0 :(得分:3)

Cin可能会在getline检索的缓冲区中留下回车符。试试

cin.ignore(1000, '\n');

cin.getline(Record[Entrynumber].Address,70);

&gt;&gt;运算符在检索数据后不会删除换行符,但在检索数据之前忽略前导空格,而getline只检索其中的任何内容,并在读取后删除'\ n',因为它是“获取”行的一部分

答案 1 :(得分:3)

看到你的getline首先读取的缓冲区中可能还有输入,我建议你在尝试输入下一个数据之前清除缓冲区:

std::cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');