문제

GCC C99로 컴파일

문자열 비교를 사용하여 2 문자열을 비교하려고합니다. 그러나 나는 strcmp 라인에서 스택 덤프를 얻는 것 같습니다.

** 속성에는 이것들이 포함되어 있으므로 frametype를 찾고 있습니다.

[name] [time] [type] [time]
[name] [callref] [type] [string]
[name] [port] [type] [int16]
[name] [frametype] [type] [int16]

비교하는이 올바른 방법입니다.

제안에 감사드립니다.

void g_start_element(void *data, const char *element, const char **attribute)
{
    for(i = 0; attribute[i]; i++)
    {
    /* Only interested in the frametype */
        if(strcmp(attribute[i], "frametype") == 0)
        {
            /* do some work here */
        }

     }
}
도움이 되었습니까?

해결책

이 코드의 맥락은 국외 구문 분석입니다. 이 게시물을 참조하십시오. 속성 배열은 이름과 값이 번갈아 가며 단일 0은 종료됩니다.

이름이나 값이 테스트 문자열과 동일한 속성 (다소 특이하지 않음)을 찾고 있지 않는 한, 코드는 이름과 값을 모두 넘어서 1이 아닌 2 만 증가해야합니다.

값과 일치하도록 이름 또는 속성 [i+1]과 일치하도록 속성 [i]을 비교해야합니다.

속성이 특정 순서라고 가정하지 마십시오. 현재 당신은 속성 만보고 있습니다1, 이것은 반환 된 첫 번째 속성의 값입니다. 속성이 둘 이상인 경우 어떤 순서로든 반환 할 수 있습니다.

다른 팁

for 루프를 종료하려면 null 문자열이 필요합니다.

[name] [time] [type] [time]
[name] [callref] [type] [string]
[name] [port] [type] [int16]
[name] [frametype] [type] [int16]
null

이것없이 For Loop은 종료되지 않으며 StrCMP를 호출 할 때 쓰레기를 가리키는 속성으로 끝납니다.

  1. 속성 배열은 어떻게 초기화됩니까? 널 요소가 미끄러질 수 있습니다.
  2. 또한 배열 요소는 널로 끝나야합니다.
  3. 사용을 고려할 수 있습니다 strncmp () strcmp ()에 대한 안전한 대안으로서.

입력 배열입니다 (attribute) null-Terminated? 당신은 그것을 존재로 나열하지는 않지만 코드는 그것을 요구합니다. 그렇지 않으면 임의의 메모리로 걸어 가면 segfaults의 좋은 원인입니다.

인덱스의 인쇄 및/또는 비교 속성을 삽입하여 종료와 관련하여 기대하는 방식을 확인하십시오.

질문의 문자열 비교 부분에 대해 잘 모르겠습니다 ... 입력에 사각형 괄호가 포함되어 있으면 각 문자열의 시작을보고 있기 때문에 아무것도 찾을 수 없습니다. 노력하다 strstr() 이 경우 하위 문자열을 찾습니다.

로깅을 추가하고 모든 속성과 인덱서 값을 덤프하십시오. 이것은 무엇이 잘못되고 있는지 식별하는 데 도움이 될 것입니다.

무효가 끝나지 않는 것 외에는 왜 strncmp ()를 사용하지 않겠습니까? :)

나는 당신이

if(attribute[1] != NULL && strcmp("frametype", attribute[1]) == 0)

그래서 당신은 널 포인터를 혐오하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top