2014-05-13 2 views
-1

나는 포인터와 그와 같은 것을 아주 새로 도입했다. 이 함수는 문자 배열을 가져 와서 따옴표가있는 곳을 제외하고 구성 요소 단어로 나눠야합니다 (따옴표 안에 모든 것이 함께 유지됩니다).토큰 화 C 블록의 세그먼트 오류

따옴표에 대한 지원을 추가하기 전에 완벽하게 작동했지만 이제는 세그먼트 오류가 발생합니다. (가) 문자열의 끝을 확인하지 않는 line 이상

int parse(char *line, char **args) { 
    int argc = 0; 

    while (*line != '\0') { 
     if (*line == '\'' || *line == '\"') { 
      *args++ = line; 
      ++argc; ++line; 

      while (*line != '\'' || *line != '\"') 
       ++line; 

      ++line; 
     } 
     else { 
      while (*line == ' ' || *line == '\t' || *line == '\n') 
       *line++ = '\0'; 

      *args++ = line; 
      ++argc; 

      while (*line != '\0' && *line != ' ' && *line != '\t' && *line != '\n') 
        ++line; 
     } 
    } 

    *--args = '\0'; 

    return --argc; 
} 
+0

당신이이 함수를 호출하는 방법을 보여 할 수없이 당신에게 문제

 while (*line != '\'' || *line != '\"') ++line; 

을 제공하는 것입니다? 어떤 변수 (및 선언/정의/초기화)를 함수에 전달합니까? 질문을 편집하여 [Minimal, Complete, Verifiable example] (http://stackoverflow.com/help/mcve)를 포함시킬 수 있습니까? –

+0

또한 디버거에서 실행 해 보았습니까? 충돌이 발생하는 시점과 위치가 중지되며 변수와 호출 스택을 검사 할 수 있습니다. 코드에 크래시가 없으면 코드를 찾을 때까지 호출 스택을 이동합니다. –

답변

1

귀하의 내부 루프는, 결함이다. 즉, 문자열에 끝 따옴표가 없으면 문자열의 끝 부분을 넘어갑니다.

+0

균형 견적은 전제 조건입니다. – user3525381

+0

@ user3525381 그러나 여러분의 코드는''this ''가 균형 잡힌 따옴표로 간주됩니다 ... 또한'''는 따옴표 대신에 아포스트로피가 될 수 있습니다.이 경우에는 균형을 유지하지 않도록 상황을 점검해야합니다 ... – twalberg

+0

또한 허용됩니다. 이것은 나의 CS 수업 중 하나에서 숙제를하기위한 것입니다. 그리고 지침의 일부는 균형이 잡혀 있고, 대칭 적이며, 따옴표가 붙는 것을 포함합니다. 나는 단지 어떤 문구도 함께 유지할 수 있어야합니다. 두 배 또는 작은 따옴표. – user3525381