关于c ++:验证无效字符的字符串

Validate string for invalid characters

我今天正在研究如何验证无效字符(如数字)的字符串输入,遗憾的是没有成功。 我正在尝试验证字符串以获取客户的姓名,并检查是否有任何数字。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include"stdafx.h"                                            
#include <string>              
#include <iostream>
#include <conio.h>
#include
#include <cctype>

using namespace std;

string validateName(string name[], int i)
{
    while(find_if(name[i].begin(), name[i].end(), std::isdigit) != name[i].end()){  
        cout <<"No digits are allowed in name." << endl;
        cout <<"Please re-enter customer's name:" << endl;
        cin.clear();                                            
        cin.ignore(20, '
'
);
    }

    return name[i];    
}

int main()
{
    string name[10];
    int i=0;
    char newentry='n';

    do{
        cout <<"Plase enter customer's name:" << endl;                                                        
        getline(cin, name[i]);  
        name[i]=validateName(name, i);

        i++

        cout <<"Would you like to enter another questionare? Enter either 'y' or 'n':" << endl;
        cin >> newentry;

    } while((newentry =='y') || (newentry=='Y'));

该功能似乎做得很好,但只有第一个输入。 例如,当我运行程序并输入数字3时,将显示一条错误消息,并要求用户再次输入名称。 用户输入有效名称后,即使没有使用数字或特殊字符,程序也会一直要求输入相同的错误消息。


我已经改变了你的代码,但由于已经很晚了,明天我必须去大学,我会留给你看看我做了什么:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <string>              
#include <iostream>
#include <conio.h>
#include
#include <cctype>

using namespace std;

void validateName(string &name) //Pass by reference and edit given string not a copy, so there is no need to return it
{
    cout <<"Plase enter customer's name:" << endl;
    cin.clear();
    cin.sync();
    getline(cin, name);
    while (name.find_first_of("0123456789") != -1)
    {
        cout <<"No digits are allowed in name." << endl;
        cout <<"Please re-enter customer's name:" << endl;
        cin.clear();
        cin.sync();
        getline(cin, name);
    }
}

int main()
{
    string name[10];
    int i = 0;
    char newentry = 'n';

    do{
        validateName(name[i++]);

        if (i >= 10)
            break;

        cout <<"Would you like to enter another questionare? Enter either 'y' or 'n':" << endl;

        do{
            cin.clear();
            cin.sync();
            cin >> newentry;
        } while ((newentry != 'y') && (newentry != 'Y') && (newentry != 'n') && (newentry != 'N'));

    } while ((newentry == 'y') || (newentry == 'Y'));
}

如果名称不正确且包含数字,则您的函数validateName没有退出循环。

我想您忘记在此循环中放置getline以重新输入名称。

还插入声明

1
2
cin.ignore(20, '
'
);

之前

1
getline(cin, name[i]);

在do-while循环中。

甚至更好地使用

1
cin.ignore( std::numeric_limits<std::streamsize>::max() );

问题是在循环结束时有声明

1
cin >> newentry;

它将新行字符放在输入缓冲区中,而下一个getline则不读取任何内容。