当我运行以下代码并在提示时插入新行(按回车键) 高尔夫结构,对该功能的第二次调用不会请求输入和结束,就像我再次按下输入一样。
我已经读过: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;
}
答案 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
(布尔类型),这是一种内置类型,文字为true
和false
。
我确信您现在可以将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;
}