c ++不验证字符串输入

时间:2018-02-27 23:30:33

标签: c++ c++11

int main() {
    Population town;
    int population;
    int numBirths, numDeaths;
    string city, intTest;
    bool isValid = true;

    do {
        cout << "Enter name of city: ";
        getline(cin, city);
        for (int i = 0; i < city.length(); i++) {
            if (!isalpha(city[i])) {
                isValid = false;
                break;
            }
        }
    } while(!isValid);

没有正确检查输入是否为字符串。不确定代码是什么问题。

2 个答案:

答案 0 :(得分:1)

if (!(isalpha(city[i]))) {
   isValid = false;
}
else {
    isValid = true;
    break;
}

此循环第一次找到字母字符时,它会将isValid设置为true,然后退出循环。如您的代码所示,如​​果字符串中有任何字母字符,则isValid为true,否则在循环后为false。

你可能真的想要这样的东西:

string city; //populate this
bool isValid = true; //Innocent till proven guilty

do {
    city = ... ; //get new city
    isValid = true; //Don't forget to reset!!
    for (int i = 0; i < city.length(); i++) {
        if(!isalpha(city[i])) {
            isValid = false;
            break; //If we're invalid, doesn't matter what the rest is
        }
    }
while(!isValid);

此外,无论出于何种原因,您都会两次阅读city

首先你读了一个单词:

cin >> city;

然后你读了一整行:

getline(cin, city);

如果城市只是一个单词,请使用第一个单词并删除第二个单词。否则,如果城市将是多个单词(用户将通过换行符输入(输入键)),请删除第一个并使用第二个。

答案 1 :(得分:0)

您使用两行来阅读city

    cin >> city;
    getline(cin, city);

你只需要其中一个。

如果城市名称中不包含空格,则对于您的应用程序,请使用第一个。否则,使用第二个。不要同时使用它们。