验证字符串中是否存在无效字符
Validate string for invalid characters
我今天正在做一些研究,研究如何验证无效字符(如数字)的字符串输入,不幸的是没有成功。我正在尝试验证用于获取客户名称的字符串,并检查是否有任何数字。
#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 不读取任何内容。
相关文章:
- 如何解决一元"*"(有"字符")错误的无效类型参数?
- 成本字符*类型的非常量引用的无效初始化,并且来自常量字符*类型的临时引用
- 错误:AES 加密密钥:从"char*"到"无符号字符"的转换无效
- 构建 NFIQ2 时从"字符"到"字符*"的转换无效
- 跨平台套接字发送,Linux 上的缓冲区常量无效* Windows上的常量字符*,最佳处理方式
- 二进制表达式的操作数无效("常量字符*"和"常量字符*")
- 答案审查 - 从"常量字符*"到"字符"的转换无效
- 从字符到康斯特* 字符的转换无效,代码有什么问题?
- 如何替换/忽略 C stdio.h getline() 中的无效 Unicode/UTF8 字符
- 如何使用ISTream对象输入多个字符到对象的数组中?(and 0作为哨兵值.下面的我的代码将无效)
- CIN是否将输入流中的无效字符取用
- 从字符 * 到 int 的转换无效
- 如何将常量无效*转换为无符号字符*
- 简短的:从字符到常量字符*的转换无效
- 用户输入逻辑运算符符号或数字,如果输入字符或字符串则无效
- 指针与无效字符合法的比较
- 验证字符串中是否存在无效字符
- XML从UnicodeString创建CData节点时出现无效字符
- arm-none-eabi-g++ 忽略表达式 stm32f4 中的无效字符"#"
- 为无效字符创建循环