2016-10-01 1 views
1

문자열을 파싱하는 데이 문제가 있습니다. 어쩌면 도움이 될 수 있습니다.문자열을 구문 분석하면 가비지가 인쇄됩니다.

나는 C 필드가 아니므로, 내가하는 바보 같은 일에 참을성있게 노력하십시오.

I이있다 :

#include <stdio.h> 
#include <string.h> 

char DataIn[65] = "WV,000B,404C494748543B."; 

int main() 
{ 
    char *p = DataIn; 

    puts(DataIn); 

    for (int count = 0;count<2 ; ++count) { 
     p = strstr(p, ","); 
     if (!p) 
      break; 
     p++;    
    } 

    char *endPointer = strchr(p, '.'); 
    *endPointer = '\0'; 

    puts(p); 
} 

I이 예에서 원하는 출력된다 : 404C494748543B (서로 다른 길이를 가질 수있다).

내가 p를 인쇄

, 은 일반적으로의 확인을하지만, 때로는 한 번만 잠시에서,이 얻을 :

일부 이전 데이터 + 쓰레기를 포함
404C494748543B 
X 
@LIGHT; 
�� 
@LIGHT; 

    ��03 

.

데이터를 추출하는 방식에 문제가 있습니까?

+0

어떤 입력이 가비지를 생성합니까? –

+1

[최소, 완료 및 확인 가능한 예제] (http://stackoverflow.com/help/mcve)를 게시하지 않는 이유는 무엇입니까? – MikeCAT

+0

'p = strstr (p, ",");'->'p = strstr (prev, ",");'... print prev. – BLUEPIXY

답변

2

대부분의 작업이 처리되지만 때때로 가비지가 발생하는 경우에는 정의되지 않은 동작입니다. 즉, DataIn은 유효하지 않은 메모리를 가리 킵니다. 즉, 할당이 해제되었거나 작업이 끝난 함수 스택에 할당 된 것입니다.

이 문제를 진단하고 해결하는 가장 좋은 방법은 메모리 프로파일 러 (예 : valgrind)를 통해 코드를 실행하는 것입니다.

참고 : 루프가 종료 될 때 두 가지 상황이 있습니다 :

  • count 2 (정상 종료)에 도달하거나
  • p이 (휴식에) NULL로 설정

endPointer을 검색하는 코드는 어떤 검사도없이 pNULL이 아니라고 가정하므로 프로그램이 중단 될 수 있습니다. 루프가 break에서 종료 될 때

+0

감사합니다. p를 확인해야한다는 것을 알았지 만 충돌이 발생했을 때 DataIn이 유효하다는 것을 알 수 있으며 검색중인 모든 문자를 가지고 있습니다. – Curnelious

+0

@Curnelious valgrind를 사용하여 실행하면 코드에서 가비지를 인쇄하지 않더라도 즉시 문제를 지적합니다. – dasblinkenlight

+0

이 코드는 칩에 포함되어 있으므로 사용할 수있는 모든 도구가 없습니다. 하지만 DataIn이 유효하다는 것을 어떻게 설명 할 수 있습니까? 나는 쉼표를 찾아서 찾지 않을 것입니다. 그걸 인쇄하고 그 유효한 (?)을 볼 수 있습니다. – Curnelious

관련 문제