为什么这段代码不停止接受输入?

问题描述 投票:0回答:1

这是一个仅允许授权股东参加会议的程序,该程序以文件输入的形式给出。

它会在终端上询问名称并检查它是否在文件中。如果不是,它会再次要求以正确的格式输入名称。如果第二次问题仍然存在,则说明该人未获得授权。

#include <iostream>
#include <fstream>
#include <string>
#include <cstring>
using namespace std;

int main(){
    ifstream name_sh;
    name_sh.open("shareholders.dat");
    string keep_sh[1000];
    char varkeep[32];
    name_sh.get(varkeep, 32);
    int counter = 0;
    while(name_sh){
        name_sh.ignore(100, '\n');
        keep_sh[counter] = varkeep;
        counter++;
        name_sh.get(varkeep, 32);
    }


    while(true){
        cout << "Please tell your name or press Q to exit ";
        char input[32];
        cin.get(input, 32);
        if(input[0]=='Q' && input[1]=='\0') break;
        for(int j = 1; j <= 2; j++){
            int i;
            for(i=0; i < counter; i++){
//                char str[32] = keep_sh[i];
                if(input == keep_sh[i]){
                    cout << "You are welcome." << endl;
                    break;
                }
            }
            if(i < counter) break;
            else if(j == 1){cout << "Write the official name in the formal way ";cin.get(input, 32);}
            else cout << "Sorry, but you are not allowed." << endl;
        }
        cout << "Next." << endl;
        //break;
    
/*string cc = keep_sh[0];
char cv[32];
cin.get(cv, 32);
cout << (cv == cc);*/

//for(int i=0; i<counter; i++) cout << keep_sh[i] << endl;
//cout << counter;
}

如果我取消注释最后一个

break
语句,循环将停止,同时检查输入是否在
keep_sh
文件中。但注释它会使代码无限循环运行。

我无法理解的是为什么终端不停止接受下一个输入,该输入正好位于 while 循环“line”之后的第五行?

底部注释的代码行表明我已经检查文件输入流工作正常。它正在打印所需的输出。

输入文件包含:

Harry Wellington
Charls Rasso
Tim Pots
Charlie Hammer
Nicolas Jorden
Peter Hann
Tobe Ludwig
Charlie Robert

每个都占单独的一行。

c++ input infinite-loop
1个回答
0
投票
当按下

Enter

 时,
std::istream::get()
不会提取终止的 \n。您将每个
\n
留在缓冲区中以供后续读取提取,因此您的
input
值将有一个领先的
\n
,这会导致您无法进行比较。而当您从文件中读取行时,您正在
ignore()
'ing
\n

在此代码中没有充分的理由使用

char[]
数组。 文件输入和用户输入都是基于行的,并且行的长度是可变的,因此您应该将
std::string
std::getline()
一起使用,而不是使用
chr[]
std::istream::get()
一起使用。

尝试更多类似这样的事情:

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

int main(){
    vector<string> keep_sh;
    string varkeep, input;

    ifstream name_sh("shareholders.dat");
    while (getline(name_sh, varkeep) {
        keep_sh.push_back(varkeep);
    }
    name_sh.close();

    do {
        cout << "Please tell your name or press Q to exit: ";
        if (!getline(cin, input)) break;
        if (input == "Q") break;
        for (int j = 1; j <= 2; ++j) {
            if (find(keep_sh.begin(), keep_sh.end(), input) != keep_sh.end()) {
                cout << "You are welcome." << endl;
                break;
            }
            if (j == 1) {
                cout << "Write the official name in the formal way: ";
                getline(cin, input);
                continue;
            }
            cout << "Sorry, but you are not allowed." << endl;
        }
        cout << "Next." << endl;
    }    
    while (true);
}
© www.soinside.com 2019 - 2024. All rights reserved.