我目前正在完成一项我必须为我的OOP课程完成的任务,我特别挣扎于1部分。请记住,我仍然是初学者。问题如下:
如果字符串包含13个字符,则所有字符都是数字,校验位是模10,此函数返回true;否则是假的。
这是关于EAN的。我基本上必须将每秒数字与其余数字分开。例如9780003194876我需要用7,0,0,1,4,7进行计算。我不知道这样做。
任何帮助将不胜感激!
bool isValid(const char* str){
if (atoi(str) == 13){
}
return false;
}
答案 0 :(得分:2)
你可以从for循环开始,每次执行都会增加2:
for (int i = 1, len = strlen(str); i < len; i += 2)
{
int digit = str[i] - '0';
// do something with digit
}
以上只是一个例子......
答案 1 :(得分:0)
由于问题被标记为C++
(不是C
,所以我建议其他回答者不要使用C库来解决这个问题。请让我们以正确的方式获得OP的C ++知识自开始以来,并且是一个OOP类我将用C ++方式解决这个问题:使用std::string
类:
bool is_valid( const std::string& str )
{
if( str.size() == 13 )
{
for( std::size_t i = 0 ; i < 13 ; i += 2 )
{
int digit = str[i] - '0';
//Do what you wan't with the digit
}
}
else
return false;
}
答案 2 :(得分:0)
首先,如果它是EAN,你必须处理每一个数字,而不仅仅是
每隔一个人。事实上,你需要做的就是加权和
的数字;对于EAN-13,重量在1和1之间交替
3,从三开始。最简单的解决方案可能是
把它们放在一张桌子上(即int weigt[] = { 1, 3, 1, 3... };
,
并迭代字符串(在这种情况下,使用索引而不是
比迭代器,因为你希望能够索引
weight
也是如此),将每个数字转换为数值
(str[i] - '0'
,如果isdigit(static_cast<unsigned char>(str[i])
是真的;如果它是假的,你还没有数码。),那么
乘以运行总数。当你完成,如果
总数,模10,是0,这是正确的。否则,它不是。
你当然不想使用atoi
,因为你不想要
字符串的数值;你想要对待每个数字
分开。
仅仅为了记录,从专业角度来说,我会写一些类似的东西:
bool
isValidEAN13( std::string const& value )
{
return value.size() == 13
&& std::find_if(
value.begin(),
value.end(),
[]( unsigned char ch ){ return !isdigit( ch ); } )
== value.end()
&& calculateEAN13( value ) == value.back() - '0';
}
其中calculateEAN13
执行实际计算(也可以
用于生成和检查)。我怀疑这个
然而,超越了作业的目标,而且都是如此
你的老师正在寻找的是calculateEAN13
功能,
最后一次检查(这就是为什么我没有全额给出)。