Cin.Getline(char,int)在循环中被跳过

cin.getline(char, int) gets skipped when in a loop

本文关键字:循环 Getline char int Cin      更新时间:2023-10-16

这是我试图在turboc 3.0上执行的代码(是的,我知道它很古老,但无济于事),当程序进入循环时,它会跳过每次的价值,包括第一次尝试。任何帮助将不胜感激,但请避免询问为什么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<<"nn";
    }
} 

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

您会得到奇怪的结果,因为您没有使用空字符终止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()之后,它将冲洗出缓冲区中存在的任何新线字符。

它跳过y

的值

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

getline读取输入,直到找到一个线结束字符(或流的末端)。由于您将其中一个留在流中,因此立即找到它并且没有阅读任何内容。

您可以致电cin.ignore(-1,'n')在阅读x之后忽略第一行的其余部分(假设您的史前库的行为与现代图书馆一样)。

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

cout.write(y, 10)是错误的 - y中最多有9个有效字符,其次是NULL终结器。您希望cout << y将其视为无效的字符串并仅打印有效字符。