2012-07-12 4 views
3

문자열을 검증해야합니다. 문자열의 형식은 "V02 : 01 : 02 : 03 : 04"입니다. 내가
2) 첫 번째 문자를 제공 정확한 길이를 확인 할
1) 인 'V'
3) 다른 모든 문자는이 개 편지 자리하고 콜론과에서 분리 : 나는을하려고하고 무엇
올바른 위치.
4) 공백 탭이 없습니다. et.c
4) 더 이상 유효성 검사가 필요하지 않습니다.
숫자와 콜론으로 문자열 검증

내가 지금 무슨 짓까지
1) 기능은 쉽게 렌을 확인하고 처음으로 알파 공간을 포함하지 않는 후 주먹 문자 그 이후의 문자를 확인할 수 없습니다. 그러나 콜론 위치를 확인하는 방법과 모든 콜론 다음에 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; 
} 
+1

솔직히 말해서, 나는 문자열을 반복하여 현재의 유효성 목록과 비교하여 각 문자를 검사 할 것입니다. 정규식? – chris

+2

? 'V ([0-9] {2} :) {5}'나는 생각합니다. – hmjd

+0

@hmjd, 와우, 지금 당신이 그것을 언급 ... – chris

답변

0

가 짧은 짧은 입력 및 엄격한 형식의 경우, 아마 같은 것을 할 것 :

mantain 합리적으로 쉽게
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.

+0

Jrok에게 고마움을 전하라. 당신의 솔루션은 fab 일뿐입니다. 나의 purppose를 제공 ​​할뿐만 아니라 새로운 것을 배울 수 있도록 도왔습니다. 엄청 고마워.. – samantha

2

매우 엄격한 검증 인 경우 문자별로 확인하지 않으시겠습니까? 예를 들어 모든 문자는 콜론해야보다 위치 모듈 3, 0이있는 경우를 제외하고 숫자 여야

if (input[0] != 'V') 
    return false; 
    if (!std::isdigit(input[1]) || !std::isdigit(input[2])) 
    return false; 
    if (input[3] != ':') 
    return false; 
    // etc... 
+1

나는 여전히 루프 어딘가에 조언을 드릴 것입니다. –

0

는 첫 번째 숫자로 시작 (당신이 이미 크기를 완료했습니다 부여). HTH 스텐

관련 문제