到目前为止,我一直在使用全局变量。我记得这不是一个好习惯。那么,有什么方法可以改变这个吗?我应该将变量作为值或引用传递吗?
这是代码 https://pastebin.com/JZaaR2Qd
using namespace std;
string user_name;
string str_age;
unsigned short int user_age;
char yes_no_prompt;
void user_biodata_input()
{
cin.clear();
cout << "Name : "; getline(cin >> ws, user_name);
cout << "Age : "; getline(cin, str_age); //taking age as a string
stringstream(str_age) >> user_age ; //extract int from a string
//Check if user input is not numeric, if so, repeat
while (cin.fail()) {
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cout << "Input invalid! Please re-enter your age in numeric..." << endl;
cin >> user_age;
}
}
int main()
{
//Speed up cin and cout
ios_base::sync_with_stdio(false);
cin.tie(NULL);
//Start
cout << "Hi User, my name is Sirius. I'm your Digital Guidance (DG), nice to meet you..." << endl;
cout << "Please provide your data..." << endl;
user_biodata_input();
show_user_biodata();
while (yes_no_prompt == 'N' || yes_no_prompt == 'n')
{
cout << "Please re-enter your biodata..." << endl;
user_biodata_input();
show_user_biodata();
}
答案 0 :(得分:0)
好吧,如果你打算使用C ++,你最好尝试利用语言功能,因此提供User
类来封装你想要收集的用户数据的内部表示会更加清晰。例如:
class User {
public:
User(string name, unsigned short int age):_name(name),_age(age) {}
bool confirm() {
cin.clear();
char yes_no_prompt;
cout << "Thank you for providing your data...";
cout << "\nPlease confirm your data...(Y/N)\n" << endl;
//printing border
cout << setfill('-') << setw(1) << "+" << setw(15) << "-" << setw(1) << "+" << setw(15) << "-" << setw(1) << "+" << endl;
//printing student record
cout << setfill(' ') << setw(1) << "|" << setw(15) << left << "Name" << setw(1) << "|" << setw(15) << left << "Age" << setw(1) << "|" << endl;
//printing border
cout << setfill('-') << setw(1) << "+" << setw(15) << "-" << setw(1) << "+" << setw(15) << "-" << setw(1) << "+" << endl;
//printing student record
cout << setfill(' ') << setw(1) << "|" << setw(15) << left << this->_name << setw(1) << "|" << setw(15) << left << this->_age << setw(1) << "|" << endl;
//printing border
cout << setfill('-') << setw(1) << "+" << setw(15) << "-" << setw(1) << "+" << setw(15) << "-" << setw(1) << "+" << endl;
//printing student record
cin >> yes_no_prompt;
if (yes_no_prompt == 'Y' || yes_no_prompt == 'y')
{
cout << "\nThank you for giving cooperation...\nWe will now proceed to the academy..." << endl;
return true;
}
return false;
}
private:
string _name;
unsigned short int _age;
};
现在您可以实现收集用户信息的功能:
User createUser()
{
cin.clear();
string user_name;
string str_age;
unsigned short int age;
cout << "Name : "; getline(cin >> ws, user_name);
cout << "Age : "; getline(cin, str_age); //taking age as a string
stringstream(str_age) >> age ; //extract int from a string
//Check if user input is not numeric, if so, repeat
while (cin.fail()) {
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cout << "Input invalid! Please re-enter your age in numeric..." << endl;
cin >> age;
}
return User(user_name, age);
}
最后主要看起来像这样:
int main()
{
//Speed up cin and cout
ios_base::sync_with_stdio(false);
cin.tie(NULL);
//Start
cout << "Hi User, my name is Sirius. I'm your Digital Guidance (DG), nice to meet you..." << endl;
cout << "Please provide your data..." << endl;
User user = createUser();
while (!user.confirm()) {
user = createUser();
}
return 0;
}
当然这只是一个草案和建议,另一种方法是让你的函数接收参数并能够返回值。虽然OOP接近IMO更加清洁。