我一直在大学课上刷我的c++
,我遇到了一个奇怪的问题,我在诊断时遇到了麻烦。
代码使用所需的结果编译并运行正常,但在获得有效条目后,程序似乎在[ENTER]
之前挂起
程序接收用于以该名称创建文件的输入。
#include<iostream>
#include<string>
#include<fstream>
using namespace std;
void createFile(string filename);//create userFile
void validateUserName(string &name);//validate user name
//main function
int main()
{
ifstream file;
string filename;
cout<< "Enter your name and press <ENTER>";
getline(cin, filename);
validateUserName(filename);
printf("validation passed\n");
createFile(filename);
}
void createFile(string filename)
{
ofstream file;
file.open(filename.c_str());
file.close();
}
void validateUserName(string &name){
int errCount = 0;
int i=0;
do
{
errCount = 0;
i=0;
while (name[i])
{
if ( !isalpha(name[i]) )
errCount++;
i++;
}
if (errCount > 0)
cout << "Invalid entry, try again" << endl;
getline(cin, name);
}
while (errCount > 0);
printf("validating\n");
}
如何避免让程序等待[ENTER]
?
答案 0 :(得分:1)
您必须将验证放入范围内的块中:
if (errCount > 0)
{ // <<<<<<<<<<<<<
cout << "Invalid entry, try again" << endl;
getline(cin, name);
} // <<<<<<<<<<<<<
答案 1 :(得分:1)
你的缩进会让你绊倒。 validateUserName
实际上应该是这样的:
void validateUserName(string &name){
int errCount = 0;
int i=0;
do
{
errCount = 0;
i=0;
while (name[i])
{
if ( !isalpha(name[i]) )
errCount++;
i++;
}
if (errCount > 0)
cout << "Invalid entry, try again" << endl;
getline(cin, name);
}
while (errCount > 0);
printf("validating\n");
}
我们真正想要关注的是do while循环的一部分
do
{
//...
if (errCount > 0)
cout << "Invalid entry, try again" << endl;
getline(cin, name);
}
while (errCount > 0);
现在您可以看到,如果输入中没有任何错误,那么仍然请求输入getline(cin, name);
不在if中。我们可以通过添加像
do
{
//...
if (errCount > 0)
{
cout << "Invalid entry, try again" << endl;
getline(cin, name);
}
}
while (errCount > 0);