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는 아닙니다.
확인을, 나는 실제 문제로 보지 않고 할 수있는 하나 개의 말 : '사용은 대부분의 프로그래머에 goto'을 찌푸리게하고, 확실히 뭔가 당신이해야 C로 시작하는 경우에 사용합니다. [합법적 인 유스 케이스] (http://stackoverflow.com/questions/245742/examples-of-good-gotos-in-c-or-c)가 있지만 C 평소의 일상적인 디자인 작업 과정에 포함시키지 말고 멀리 떨어져있는 것이 가장 좋습니다. –
'goto'는 사용하기가 어렵지만 다른 흐름 제어 명령문처럼 ** 사용하면 대부분의 시간과 대부분의 학습 재미를 없애 버리는 버그를 찾기가 매우 어려워집니다 ** E. E.Dijkstra의 [고전] (http://homepages.cwi.nl/~storm/teaching/reader/Dijkstra68.pdf)을 읽으십시오. –
@RodyOldenhuis 그 goto 구문의 사용은 라이브러리 자체의 예제에서 직접 가져온 것으로 동의합니다. –