验证字符串中是否存在无效字符

Validate string for invalid characters

本文关键字:无效 字符 存在 是否 字符串 验证      更新时间:2023-10-16

我今天正在做一些研究,研究如何验证无效字符(如数字)的字符串输入,不幸的是没有成功。我正在尝试验证用于获取客户名称的字符串,并检查是否有任何数字。

#include "stdafx.h"                                             
#include <string>               
#include <iostream>
#include <conio.h>
#include <algorithm>
#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, 'n');
    }
    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 时,将显示一条错误消息,并要求用户再次输入名称。但是,在用户输入有效名称后,即使没有使用数字或特殊字符,程序也会不断要求具有相同错误消息的新输入。

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

#include <string>               
#include <iostream>
#include <conio.h>
#include <algorithm>
#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放入此循环中以重新输入名称。

还插入语句

cin.ignore(20, 'n');

以前

getline(cin, name[i]);  

在 do-while 循环中。

甚至更好用

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

问题是在循环的末尾有语句

cin >> newentry;

这会将换行符放在输入缓冲区中,下一个 getline 不读取任何内容。