2013-12-11 4 views
-1

그래서 런타임 오류를 디버깅하고 있습니다. "문자열 첨자가 범위를 벗어났습니다."문자열 첨자가 범위를 벗어남 C++ : 디버그

나는 어디에 문제가 있으며 무엇이 원인인지 알고있다. 그러나 나에게 오류를주지 않고서도 비슷하게 또는 똑같은 방식으로 수행 할 수있는 가능한 해결책을 찾고있다.

다음은 오류가 발생한 부분의 코드입니다. 내가 틀렸다고 정정하면 0 번째 길이의 문자열을 선언하고 n 번째 요소를 조작하려고하기 때문에 문제가 발생합니다. Btw은 문제가이 줄을이었다 관심이 누구를위한

std::string VsuShapeLine::GetRunwayNumber() 
{ 
    std::string name, nbstr, newnbstr, convnbstr; 
    int idx,idx2, num, count, pos; 
    char buf[3]; 
    int idx3=-1; 
    name = this->GetName(); 
    idx = name.find("ALight"); 
    if (idx == -1) 
    { 
     idx = name.find("Lights"); 
     idx3 = name.find_last_of("Lights"); 
    } 
    idx2 = name.find('_'); 
    idx2 +=3; 

    nbstr = name.substr(idx2, idx-idx2); 

    if (idx3 != -1) 
     idx3++; 
    else 
     idx3 = idx+6; 

    if (name.at(idx3) == 'N') 
    { 
     pos = nbstr.length(); 
     if (isalpha(nbstr[idx-1])) 
      nbstr[pos-1] = _toupper(nbstr[pos-1]); 
     return (nbstr); 
    } 

    else if (name.at(idx3) == 'F') 
    { 
     convnbstr = nbstr.substr(0,2); 
     num = atoi(convnbstr.data()); 
     num +=18; 
     _itoa(num, buf, 10); 
     newnbstr = buf; 
     count = nbstr.size(); 

     if (count > 2) 
     { 
      if (nbstr.at(2) == 'l' || nbstr.at(2) == 'L') 
       newnbstr += 'r'; 

      else if (nbstr.at(2) == 'r'|| nbstr.at(2) == 'R') 
       newnbstr += 'l'; 

      else if (nbstr.at(2) == 'c' || nbstr.at(2) == 'C') 
       newnbstr += 'c'; 
     } 
     pos = newnbstr.length(); 
     if (isalpha(newnbstr[pos-1])) 
      newnbstr[pos-1] = _toupper(newnbstr[pos-1]); 
     return (newnbstr); 
    } 

    return (""); 
} 
+1

어쩌면 당신은 당신의 쟁점 인 것처럼 보이는'idx'가 무엇인지를 보여줄 수 있습니다. –

+0

전체 코드이고 문자열이 실제로 비어있는 경우 색인을 생성 할 수 없습니다. –

+0

당신은 그것을 선언하고 그것에 색인을 붙이려고하는 사이에 무엇이든지'nbstr'을합니까? 'pos'가 0이면 확실하게'nbstr [pos-1]'은 런타임에 맞는 시작을줍니다. –

답변

0

:

if (isalpha(nbstr[idx-1]) 

이 시점 nbstr에서 길이 3 IDX '값의 문자열입니다, 내 프로그램이 작동하는 방식은, 하나 항상 9 또는 10입니다.

또한 은퇴 한 닌자는 string :: find 함수를 사용한 후에 확인해야합니다.