C++ 验证字符串是否只有数字和特定长度
所以我有个问题 我需要获取一个字符串(我不能将其作为int,必须将其定义为字符串),并且在set方法中,我必须验证数字是否为9或13位,并且只包含数字 我可以使用str.length()验证长度,但无法让它验证输入仅包含数字 这是我目前的代码: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 &
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);…}