do-while循环中的C ++意外暂停

时间:2017-07-07 18:08:03

标签: c++ input

我一直在大学课上刷我的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]

2 个答案:

答案 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);