cin.get()问题空行

时间:2013-02-18 19:23:12

标签: c++ string line

当我运行以下代码并在提示时插入新行(按回车键) 高尔夫结构,对该功能的第二次调用不会请求输入和结束,就像我再次按下输入一样。

我已经读过:cin.get(),cin.clear(),cin.ignore(...)但似乎没有任何帮助。

我很确定它与多个.cpp文件和标题无关,但我按原样放置代码。

我正在使用Visual Studio C ++ 2010 - Express。

提前感谢您的帮助!

头文件:golf.h

#ifndef GOLF_H
#define GOLF_H

const int Len = 40;

struct golf{

    char fullname[Len];
    int handicap;

};

int setgolf(golf & g );
void showgolf(const golf & g );

#endif

golf.cpp

#include "stdafx.h"
#include "golf.h"
#include <iostream>
#include <string>


using namespace std;

int setgolf(golf & g ){

    cout << "Enter a name for the golf structure:" << endl;
    if  (cin.get(g.fullname,Len)) {     
        cin.get(); // deals with the '\n' incase the user inputs a valid string
        return 1;
    }
    else{
        return 0;
    }

}
void showgolf(const golf & g ){

    cout << "this golf structure contains the following information:" << endl;
    cout << "name:      " << g.fullname << endl ;
    cout << "handicap:  " << g.handicap << endl ;

}

main()

#include "stdafx.h"
#include "golf.h"
#include <iostream>
#include <string>


using namespace std;

int main()
{

    golf myGolf;

    // check of int setgolf(golf & g );
    int answ = setgolf(myGolf); //try to input empty string
    showgolf(myGolf);
    cout << "the number returned :" << answ << endl ;

    answ = setgolf(myGolf); // normal string
    showgolf(myGolf);
    cout << "the number returned :" << answ << endl ;

    return 0;
}

2 个答案:

答案 0 :(得分:2)

当您在第一个提示中按Enter键时会发生此问题。输入流标记为eof,错误条件标志(这就是它返回0的原因)。输入流然后停止工作。

似乎你正在使用一种旧的 C ++,在ISO 1998之前,而我认为你不需要它。但是,如果您想坚持自己的方法,请执行以下操作:在cin.getline()之后(无需返回任何内容)写入:cin.clear(); cin.sync();,如下所示:

void setGolf(Golf &g)
{
    cout << "Enter a name for the golf structure:" << endl;
    getline( cin, g.fullname ) );

    cin.clear();
    cin.sync();
}

现在,关于现代化您的代码。首先,您可以使用标准库的类string,它可以存储字符串文字,甚至可以根据需要增长,而不会给出最大的字符值。这有点令人困惑,因为你要包含标题string,它将包含该类,但你没有使用它。使用string还具有其他优点,例如自动纠正可能在Golf结构中发生的潜在缓冲区溢出。所以我会改变你的结构:

struct Golf{
    string fullname;
    int handicap;
};

现在,您可以在getline()中使用utility,它会读取整行并将其存储在string中,为您完成所有魔法。因此,您可以将golf.cpp文件更改为:

#include <utility>

//...

void setGolf(Golf &g)
{
    cout << "Enter a name for the golf structure:" << endl;
    getline( cin, g.fullname ) );   
}

您现在还可以将返回类型更改为void。使用getline()时,不可能遇到任何类型的错误。无论如何,请考虑您可以返回bool(布尔类型),这是一种内置类型,文字为truefalse

我确信您现在可以将main()改为更简单的风格:

int main()
{

    Golf myGolf;

    setGolf(myGolf);
    showGolf(myGolf);

    setGolf(myGolf);
    showGolf(myGolf);

    return 0;
}

最后,你可以考虑将你的信息封装在一个类而不是一个结构中,但这是一个完全不同的问题。

希望这有帮助。

答案 1 :(得分:0)

您也可以保留char[]而不是用字符串代替(我仍在学习,所以如果我错了,请更正我)。我认为 std::cin.get(char *,Size)无法加载字符,将2位设置为0,失败和错误,这是我的解决方案:

std::cin.get(g.fullname, Len);
if(!std::cin)
{
  std::cin.clear();
  std::cin.get();
  std::cout << "You inserted empty line." << std::endl;
  return 0;
}