验证用户字符串用户输入

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 考虑您输入了多少字符以及您测试了多少。 我不太明白。 @ElSpiffy 当遇到'\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 循环的情况下做到这一点?

以上是关于验证用户字符串用户输入的主要内容,如果未能解决你的问题,请参考以下文章

如何只允许用户输入字符并进行验证?

在插入向量 C++ 之前验证用户输入

如何验证用户字符串输入不包含 sql 注入?在Javascript中

表单验证输入用户名和密码时验证大于6个字符,

正则表达式,电子邮件验证从文本框中获取用户输入

js如何验证用户输入的只能是数字?