cin.getline(char,int)在循环中被跳过

时间:2014-01-29 17:49:00

标签: c++ getline turbo-c++

这是我试图在TurboC ++ 3.0上执行的代码(是的,我知道它很古老但无法帮助它),当程序进入循环时,它每次跳过y的值,包括第一个尝试。任何帮助将不胜感激,但请通过询问为什么TurboC ++ 3.0避免将盐揉入伤口。提前谢谢。

void main()
{
    int x, z;
    char y[10];
    for (int i=0;i<5;i++)
    {
        cout<<"\nX:";
        cin >> x;
        cout<<"\nY:"; 
        cin.getline(y,10); 
        cout<<"\nZ:";
        cin>>z;
    }
    for(i=0;i<5;i++)
    {
        cout<<x<<"\n"; 
        cout.write(y, 10)<<"\n";
        cout<<z<<"\n\n";
    }
} 

即使我使用cin.get(var),其中var是一个角色,我仍然会得到奇怪的结果,如心脏,钻石甚至是笑脸。

2 个答案:

答案 0 :(得分:0)

你得到了奇怪的结果,因为你没有用空字符终止你的c样式字符串。('\ 0')。
您遇到的问题是因为设置了失败位或eof位。要删除它,请执行以下操作: -

您可以使用

  cin.clear() ; 

清除是否设置了任何错误位,然后使用

cin.ignore(100, '\n') ; 
// 100 is just a random no, change it depending on your size of input.

忽略流中的任何不相关字符。

或者您可以执行以下操作: -

cin>>x之后输入cin.ignore(),它将清除缓冲区中存在的任何换行符。

答案 1 :(得分:0)

  

它会跳过y的值

cin >> x读取输入,直到找到不是数字的东西 - 在这种情况下,是行尾字符。该字符留在流中。

getline读取输入,直到找到行尾字符(或流的结尾)。由于您在流中留下了一个,因此它会立即找到它并且不会读取任何内容。

您可以在阅读cin.ignore(-1,'\n')后调用x忽略第一行的其余部分(假设您的史前库与现代库的行为相似)。

  

我仍然得到奇怪的结果,如心脏,钻石甚至笑脸

cout.write(y, 10)错误 - y中有多达9个有效字符,后跟空终止符。您希望cout << y将其视为以空字符结尾的字符串,并仅打印有效字符。