2017-07-07 9 views
0

私はc++に大学のクラスでブラッシングしていましたが、診断に問題がある奇妙な問題が発生しました。do-whileループでC++不要な一時停止が発生する

コードがコンパイルされ、望ましい結果でOK実行されますが、有効なエントリを取得した後、プログラムは

を継続プログラムは、それがその名前でファイルを作成するために使用する入力を受け取る前に[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]を待っているプログラムのハングアップを回避するにはどうすればよいですか?

+1

エラーチェックif文のあちこちに括弧がありません。 – Rakete1111

+0

'std :: cout'はデフォルトでバッファリングされます。何があなたをたたくのだろうか? Btw;なぜあなたは 'cout'と' printf'を混ぜていますか? –

+1

ここに構造がありません。関数内の1つのトピックを保持してください。 validate関数はただ検証する必要があります。失敗した場合は、エラーを返します。呼び出し関数は、より多くの入力のためにループを回ります。検証関数の入力を増やすのは間違っています... –

答えて

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 
{ 
    //... 
    if (errCount > 0) 
     cout << "Invalid entry, try again" << endl; 
    getline(cin, name); 

} 
while (errCount > 0); 

今はあなたがすべてのエラーを持っていない場合ことを確認することができながら、私たちが本当にに集中したいことはやるの一部です。 getline(cin, name);という入力をまだ入力していない場合は、その内部にはありません。

1

あなたはスコープのブロックにあなたの検証を配置する必要があります:

if (errCount > 0) 
{ // <<<<<<<<<<<<< 
    cout << "Invalid entry, try again" << endl; 
    getline(cin, name); 
} // <<<<<<<<<<<<< 
関連する問題