Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 验证字符串是否只有数字和特定长度_C++_String_Int - Fatal编程技术网

C++ 验证字符串是否只有数字和特定长度

C++ 验证字符串是否只有数字和特定长度,c++,string,int,C++,String,Int,所以我有个问题 我需要获取一个字符串(我不能将其作为int,必须将其定义为字符串),并且在set方法中,我必须验证数字是否为9或13位,并且只包含数字 我可以使用str.length()验证长度,但无法让它验证输入仅包含数字 这是我目前的代码: void Book::setISBN(string ISBN) { //validate the length here ALSO NEED TO VALIDATE ITS A NUMBER if (ISBN.length() >= 9 &

所以我有个问题

我需要获取一个字符串(我不能将其作为int,必须将其定义为字符串),并且在set方法中,我必须验证数字是否为9或13位,并且只包含数字

我可以使用str.length()验证长度,但无法让它验证输入仅包含数字

这是我目前的代码:

void Book::setISBN(string ISBN) 
{

//validate the length here  ALSO NEED TO VALIDATE ITS A NUMBER

if (ISBN.length() >= 9 && ISBN.length() <= 13) {

    this->ISBN = ISBN;
}
else {
    this->ISBN = '0';
}
}
第一部分,b的工作原理是,setISBN(“23”)将返回一个零,但是b2“thisishith”将返回一个零。我需要它也返回0。如果它是一组长度在9-13之间的数字,那么它将正确返回

任何帮助都将不胜感激


我试过isdigit(),但说它不能在字符串和int之间转换。

在你的
书中
构造函数中,确保它正在调用
setISBN()
而不是直接设置
this->ISBN

Book::Book(string ISBN, ...) {
    //this->ISBN = ISBN;
    this->setISBN(ISBN);
    ...
}
然后,在
setISBN()
中,您可以执行以下操作:

void Book::setISBN(string ISBN) 
{
    if (((ISBN.length() == 9) || (ISBN.length() == 13)) &&
        (ISBN.find_first_not_of("0123456789") == string::npos))
    {
        this->ISBN = ISBN;
    }
    else
    {
        this->ISBN = '0';
    }
}
如果要改用
isdigit()
,则需要一个循环来检查字符串中的每个
char
。您可以手动执行以下操作:

#include <cctype>

void Book::setISBN(string ISBN) 
{
    if ((ISBN.length() == 9) || (ISBN.length() == 13))
    {
        for (int i = 0; i < ISBN.length(); ++i)
        {
            if (!isdigit(static_cast<unsigned char>(ISBN[i])))
            {
                this->ISBN = '0';
                return;
            }
        }
        this->ISBN = ISBN;
    }
    else
    {
        this->ISBN = '0';
    }
}

#包括
#包括
void Book::setISBN(字符串ISBN)
{
如果((ISBN.length()=9)| |(ISBN.length()=13))&&
std::all_of(ISBN.begin(),ISBN.end(),[](char ch)->bool{return isdigit(static_cast(ch));})
{
此->ISBN=ISBN;
}
其他的
{
此->ISBN='0';
}
}

在您的
书中
构造函数中,确保它正在调用
setISBN()
,而不是直接设置
this->ISBN

Book::Book(string ISBN, ...) {
    //this->ISBN = ISBN;
    this->setISBN(ISBN);
    ...
}
然后,在
setISBN()
中,您可以执行以下操作:

void Book::setISBN(string ISBN) 
{
    if (((ISBN.length() == 9) || (ISBN.length() == 13)) &&
        (ISBN.find_first_not_of("0123456789") == string::npos))
    {
        this->ISBN = ISBN;
    }
    else
    {
        this->ISBN = '0';
    }
}
如果要改用
isdigit()
,则需要一个循环来检查字符串中的每个
char
。您可以手动执行以下操作:

#include <cctype>

void Book::setISBN(string ISBN) 
{
    if ((ISBN.length() == 9) || (ISBN.length() == 13))
    {
        for (int i = 0; i < ISBN.length(); ++i)
        {
            if (!isdigit(static_cast<unsigned char>(ISBN[i])))
            {
                this->ISBN = '0';
                return;
            }
        }
        this->ISBN = ISBN;
    }
    else
    {
        this->ISBN = '0';
    }
}

#包括
#包括
void Book::setISBN(字符串ISBN)
{
如果((ISBN.length()=9)| |(ISBN.length()=13))&&
std::all_of(ISBN.begin(),ISBN.end(),[](char ch)->bool{return isdigit(static_cast(ch));})
{
此->ISBN=ISBN;
}
其他的
{
此->ISBN='0';
}
}
算出了

代码中还有一部分是:

Book::Book(string ISBN, string author, string title, double price) {
this->ISBN = ISBN;
this->author = author;
this->title = title;
this->price = price;`
我在该行末尾添加了以下内容:

    if ((ISBN.length() == 9) || (ISBN.length() == 13) &&
    ISBN.find_first_not_of("0123456789") == string::npos)
{
    this->ISBN = ISBN;
}
else {
    this->ISBN = '0';
}
这解决了我需要解决的问题。谢谢

找到了

代码中还有一部分是:

Book::Book(string ISBN, string author, string title, double price) {
this->ISBN = ISBN;
this->author = author;
this->title = title;
this->price = price;`
我在该行末尾添加了以下内容:

    if ((ISBN.length() == 9) || (ISBN.length() == 13) &&
    ISBN.find_first_not_of("0123456789") == string::npos)
{
    this->ISBN = ISBN;
}
else {
    this->ISBN = '0';
}

这解决了我需要解决的问题。谢谢

“9或13位长度”和“9-13位长度之间的数字”是相互矛盾的要求。你到底需要哪一个?确切地说是9位或13位,还是9位和13位之间?我在这里引用了作业。所以我假设9位或13位。然而,正如我所说的,长度不是我所需要的,我需要能够验证它们只是数字的,非字母顺序的。为什么你要从ISBN-10中分割校验和,而不是从ISBN-13中分割校验和?你在说什么?ISBN要么是老式的ISBN-10(校验和最后,0到9或X),要么是新式的ISBN-13(校验和是最后一个,从0到9)。前者可以映射到后者。.“9或13位长度”和“9-13位长度之间的数字”是相互矛盾的要求。你真正需要哪一个?确切地说是9或13位,还是介于9和13位之间?我逐字引用了这里的作业。因此,我将假设是9位或13位。但是,正如我所说的,长度不是我需要的,我需要能够验证它们只是数字,而不是字母。为什么要将校验和从ISBN-10中分离出来,而不是从ISBN-13中分离出来?你在说什么?ISBN要么是旧式的ISBN-10(校验和是最后的,0到9或X),要么是新式的ISBN-13(校验和是最后的,0到9)。前者可以映射到后者。当我运行此操作时,它仍然不会将所需的项转换为0,它仍然显示“ThisisHith”确保您的构造函数使用方法
setISBN
设置ISBN,或者在构造函数中执行与ISBN类似的检查。当我运行此操作时,它仍然不会将所需的项转换为0,它仍然显示“ThisisHith”“确保您的构造函数使用方法
setISBN
设置ISBN,或者在构造函数中执行与ISBN类似的检查。更好的解决方案是让该构造函数调用
setISBN()
,这样您的验证都在一个地方:
Book::Book(string ISBN){this->setISBN(ISBN);…}”
更好的解决方案是让构造函数调用
setISBN()
,这样您的验证都在一个地方:
Book::Book(string ISBN){this->setISBN(ISBN);…}