验证用户字符串用户输入
Posted
技术标签:
【中文标题】验证用户字符串用户输入【英文标题】:Validating User String User Input 【发布时间】:2015-11-28 09:57:41 【问题描述】:所以我一直在尝试创建这个程序,该程序将使用字符串和字符串类从用户那里获取最多 12 位数字。我遇到的问题是:
-
忽略 (-) 符号。
忽略小数点。
输入超过 12 位时出现错误。
只接受数字(即不接受字母)
到目前为止,这是我所拥有的:
#include <iostream>
#include <string>
#include <cctype>
#include <iomanip>
using namespace std;
bool test(char [] , int);
int main()
const int SIZE= 13;
char number[SIZE];
int count;
cout<< "Please enter a number up to "<< (SIZE-1) <<" digits long." << endl;
cout<< "The number may be positive or negative" << endl;
cout<< "and may include fractions (up to two decimal positions)" << endl;
cout<< "Sign and decimal dot(.) are not included in the digit count:"<< "\t";
cin.getline (number, SIZE);
if (test(number, SIZE))
while (number[count]!='\0')
cout<< "The currency value is: \t $";
cout<< setprecision(2) << number[count];
count++;
else
cout << "Invalid number: contains non-numeric digits.";
return 0;
bool test(char testNum[], int size)
int count;
for (count = 0; count< size; count++)
if(!isdigit(testNum[count]))
return false;
return true;
非常感谢任何帮助,但目前对我来说最重要的是第四点。无论输入是什么,输出都是“无效数字:....”,我不确定这是为什么。
【问题讨论】:
您甚至可以使用isdigit()
测试终止符(空字符)。也就是说,你为什么要使用原始数组?使用std::string line;
,然后使用getline(std::cin, line);
读取该行并从那里开始检查。
所以,不测试我输入的(null char)(count '\0'
字符时,您应该停止循环。
【参考方案1】:
即使输入较短,您的测试函数也始终测试 13 个字符。
而是传递一个字符串并使用基于范围的 for 循环,以便您只测试有效字符 - 类似于:
bool test(string testNum)
for (auto c : testNum)
if(!isdigit(c))
return false;
return true;
您还应该更改主循环(打印值的位置),即使用字符串而不是字符数组。
顺便说一句 - 请注意,这只会检查数字。您对有效输入格式的描述将需要更复杂的测试功能。
例如检查标志,你可以添加:
bool test(string testNum)
bool signAllowed = true;
for (auto c : testNum)
if (c == '-')
if (!signAllowed) return false;
else
if(!isdigit(c)) return false;
// Sign not allowed any more
signAllowed = false;
return true;
但您仍然需要更多代码来检查点 (.)
如果你不想使用基于范围的 for 循环,你可以这样做:
bool test(string testNum)
for (int i = 0; i < testNum.size(); i++)
if (testNum[i] == '-')
// Sign is only allowed as first char
if (i != 0) return false;
else
if(!isdigit(testNum[i])) return false;
return true;
【讨论】:
对我来说一切都有意义,除了自动 c,你能解释一下那是什么吗?你在 c 中使用 auto 关键字吗?auto
就像编写类型的简写,即编译器会自动分配正确的类型。在这种情况下,您还可以编写 for (char c : testNum)
,因为基于范围的字符串 for 循环将一个接一个地返回字符串中的字符。
std::all_of
执行相同的过程
@StillLearning 我创建了另一个布尔值来测试参数是否是字母表元素和可打印字符。我只是不知道如何让 (-) 符号例外。
有没有办法在不使用基于范围的 for 循环的情况下做到这一点?以上是关于验证用户字符串用户输入的主要内容,如果未能解决你的问题,请参考以下文章