强制仅按字母输入

时间:2017-11-26 16:10:43

标签: c++ loops

我正在尝试为学校的项目编写基于文本的游戏。到目前为止,我做得还不错,但作为完美主义者,我想要为玩家的角色设置字母名称。我一直在努力寻找解决方案。我认为问题可能在于我将自己与太多的循环混淆了。再说一遍,我不是那个最好的判断者。这就是我在代码方面的作用;这有点乱。不介意我的goto使用..

while(cin >> name){
    for(int x = 0; x < name.length(); x++){
        char c = name.at(x);
        while(!isalpha(c)){
            cin.clear();
            cin.ignore(1000, '\n');
            cout << "Names are alphabetical only, with no spaces.\n";
            cin >> name;
            for(int x = 0; x < name.length(); x++){
                char c = name.at(x);
                if(isalpha(c))
                    goto breakingout;
            }
        }
    }
    breakingout:
        break;
}

我想要的其他一些可能阻碍我的事情是,我希望错误消息只出现一次(它会在一个输入中出现多个非字母字符多次),所以任何人都可以获得奖励积分可以帮助我:)

2 个答案:

答案 0 :(得分:0)

也许更喜欢这样的东西?

bool isDone = false;
while(!isDone)
{
    string input;
    getline(cin, input);
    isDone = true;
    for(int i = 0; i<input.size(); i++)
    {
        if(!isAlpha(input[i]))
            isDone = false;
    }
}

答案 1 :(得分:0)

您只能使用一个循环和一个goto语句:

string name;
cout << "Enter your name: ";
cin >> name;

   breakingout:
   for(unsigned i = 0; i != name.size(); i++) {
       char c = name.at(i);
       if(!isalpha(c)) {
           cout << "Enter your name without numbers: ";
           cin >> name;
           goto breakingout;
       }
   }

或者像这样的迭代器,建议在C ++中使用。

string name;
cout << "Enter your name: ";
cin >> name;

   breakingout:
   for(auto iter = name.cbegin(); iter != name.end(); iter++) {
       if(!isalpha(*iter)) {
           cout << "Enter your name without numbers: ";
           cin >> name;
           goto breakingout;
       }
   }