2017-01-04 3 views
0

저는 C 프로그래머가 아니지만 최근에 관심이 있습니다. C libyaml 라이브러리를 사용하여 YAML 파일의 노드를 수정하려고합니다. 이벤트 스칼라 데이터에서 노드를 수정하려고하면 컴파일러에서 불평하지 않지만 세그먼트 오류 오류가 발생합니다.C에서 기존 YAML 노드를 수정하는 방법은 무엇입니까?

while (!done) 
{ 
    /* Get the next token. */ 

    if (!yaml_parser_parse(&parser, &event)) 
     goto parser_error; 

    //yaml_parser_scan(&parser, &token); 

    /* Check if this is the stream end. */ 

    if(beginServerNodes && event.type == 8) { 
     beginServerNodes = 0; 
    } 

    if (event.type == YAML_SCALAR_EVENT) { 
     if(beginServerNodes == 1) { 
     //I WANT TO MODIFY THIS VALUE 
     printf("%s\n", event.data.scalar.value); 
     } 
     if(strcmp("servers",event.data.scalar.value) == 0) { 
     beginServerNodes = 1; 
     } 
    } 

    if (event.type == YAML_STREAM_END_EVENT) { 
     done = 1; 
    } 
    /* Emit the token. */ 

    if (!yaml_emitter_emit(&emitter, &event)) 
     goto emitter_error; 
} 

그래서 그것은 유형 yaml_char_t

yaml_char_t *newHost = "10.132.16.48:6379:1 redis-001"; 
    event.data.scalar.value = newHost; 
    event.data.scalar.length = sizeof(newHost); 

이어야합니다 다음 값을

event.data.scalar.value 

을 수정하려고 그 루프에서 컴파일러는 코드 실행 불평하지 않는 동안 단절된 결함이있는 다이. libyaml 테스트 디렉토리에있는 예제를 본 적이 있지만 노드를 편집하는 것만 큼 직관적 인 것은 없습니다. 적어도 나 자신과 같은 C newb는 아닙니다.

+0

확인을, 나는 실제 문제로 보지 않고 할 수있는 하나 개의 말 : '사용은 대부분의 프로그래머에 goto'을 찌푸리게하고, 확실히 뭔가 당신이해야 C로 시작하는 경우에 사용합니다. [합법적 인 유스 케이스] (http://stackoverflow.com/questions/245742/examples-of-good-gotos-in-c-or-c)가 있지만 C 평소의 일상적인 디자인 작업 과정에 포함시키지 말고 멀리 떨어져있는 것이 가장 좋습니다. –

+0

'goto'는 사용하기가 어렵지만 다른 흐름 제어 명령문처럼 ** 사용하면 대부분의 시간과 대부분의 학습 재미를 없애 버리는 버그를 찾기가 매우 어려워집니다 ** E. E.Dijkstra의 [고전] (http://homepages.cwi.nl/~storm/teaching/reader/Dijkstra68.pdf)을 읽으십시오. –

+0

@RodyOldenhuis 그 goto 구문의 사용은 라이브러리 자체의 예제에서 직접 가져온 것으로 동의합니다. –

답변

1

리비아어는 각 스칼라 값을 free()을 통해 제거 할 수 있다고 예상합니다. 그래서 당신은 malloc() 에드 메모리가이 값을 초기화해야합니다

const char* newHost = "10.132.16.48:6379:1 redis-001"; 
event.data.scalar.value = (yaml_char_t*)strdup(newHost); 
event.data.scalar.length = strlen(newHost);