用整数C ++分隔每秒的数字

时间:2014-01-26 17:37:55

标签: c++ string numbers boolean

我目前正在完成一项我必须为我的OOP课程完成的任务,我特别挣扎于1部分。请记住,我仍然是初学者。问题如下:

如果字符串包含13个字符,则所有字符都是数字,校验位是模10,此函数返回true;否则是假的。

这是关于EAN的。我基本上必须将每秒数字与其余数字分开。例如9780003194876我需要用7,0,0,1,4,7进行计算。我不知道这样做。

任何帮助将不胜感激!

bool isValid(const char* str){
if (atoi(str) == 13){

}

return false;
}

3 个答案:

答案 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功能, 最后一次检查(这就是为什么我没有全额给出)。