3

文字列を検証する必要があります。文字列の形式は「V02:01:02:03:04」のようになります。
私がやろうとしていること
1)正しい長さが提供されていることを確認したい
2)最初の文字は「V」です
3)他のすべての文字は2文字の数字で、コロンで区切られ、正しい位置にあります。
4)空白のタブなどはありません。4
)これ以上の検証について考えることはできません。

私がこれまでに行ったこと
1)関数はlenとfist charを簡単にチェックし、最初の文字の後に続く文字にアルファまたはスペースが含まれていないことを確認しません。しかし、コロンの位置とすべてのコロンの後に2文字の文字をチェックする方法については少し行き詰まっています。

以下は私の試みです。

 int firmwareVerLen = 15;
const std::string input = "V02:01:02:03:04"; // this is the format string user will input  with changes only in digits.
bool validateInput( const std::string& input )
{
    typedef std::string::size_type stringSize;
    bool result = true ;
    if( firmwareVerLen != (int)input.size() )
    {       
      std::cout <<" len failed" << std::endl;
      result = false ;
    }

    if( true == result )
   {

        if( input.find_first_of('V', 0 ) )
        {
             std::cout <<" The First Character is not 'V' " << std::endl;
             result = false ;
         }
   }

   if( true == result )
   {
        for( stringSize i = 1 ; i!= input.size(); ++ i )
       {
            if( isspace( input[i] ) )
           {
               result = false;
               break;
           }
           if( isalpha(input[i] ) )
            {
               cout<<" alpha found ";
               result = false;
               break;
            }

             //how to check further that characters are digits and are correctly  separated by colon
        }
    }

   return result;
 }
4

3 に答える 3

2

厳密な検証の場合は、文字ごとに確認してみませんか?たとえば(すでにサイズを設定している場合)

  if (input[0] != 'V')
    return false;
  if (!std::isdigit(input[1]) || !std::isdigit(input[2]))
    return false;
  if (input[3] != ':')
    return false;
  // etc...
于 2012-07-12T16:15:39.693 に答える
0

最初の数字から始めて、3を法とする位置が0である場合を除いて、すべての文字はコロンでなければならない数字でなければなりません。

HTHトルステン

于 2012-07-12T16:17:26.867 に答える
0

このような短い短い入力と厳密な形式の場合、私はおそらく次のようなことをします。

bool validateInput( const std::string& input )
{
    static const size_t digit_indices[10] = {1, 2, 4, 5, 7, 8, 10, 11, 13, 14};
    static const size_t colon_indices[4] = {3, 6, 9, 12};
    static const size_t firmwareVerLen = 15;

    static const size_t n_digits = sizeof(digit_indices) / sizeof(size_t);
    static const size_t n_colons = sizeof(colon_indices) / sizeof(size_t);

    if (input.size() != firmwareVerLen) return false;     // check 1)
    if (input[0] != 'V') return false;                    // check 2)

    for (size_t i = 0; i < n_digits; ++i)                       // check 3)
        if (!is_digit(input[digit_indices[i]]) return false;

    for (size_t i = 0; i < n_colons; ++i)                        // check 3)
        if (input[colon_indices[i]] != ':') return false;

    // check 4) isn't needed

    return true;
}

入力フォーマットが変更された場合、IMOを管理するのはかなり簡単です。

于 2012-07-12T17:01:51.390 に答える