如何在C中修改现有的YAML节点?

如何在C中修改现有的YAML节点?,c,libyaml,C,Libyaml,我不是C程序员,但最近对它很感兴趣。我正在尝试使用C libyaml库修改YAML文件的节点。当我试图从事件标量数据修改节点时,编译器不会抱怨,但会出现分段错误 while (!done) { /* Get the next token. */ if (!yaml_parser_parse(&parser, &event)) goto parser_error; //yaml_parser_scan(&parser, &

我不是C程序员,但最近对它很感兴趣。我正在尝试使用C libyaml库修改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;
}
所以在循环中,当我试图修改以下值时

event.data.scalar.value
它必须是
yaml\u 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);

编译器没有抱怨,并且运行的代码带有分段错误。如果你看过libyaml测试目录中的示例,但就编辑一个节点而言,没有什么是直观的,至少对我这样的C新手来说是这样。

libyaml希望通过
free()
删除每个标量的值。因此,您需要使用
malloc()
ed内存初始化此值:

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);

好的,我可以在不考虑实际问题的情况下说一句话:大多数程序员都不赞成使用
goto
,当然也不是刚开始使用C时应该使用的东西。它有一些,但学习C时最好远离它,与其将其作为日常设计工作流程的一部分,倒不如说
goto
很难使用,但像其他流控制语句一样使用它会导致一些极难发现的bug,这会占用你大部分的时间和学习C的大部分乐趣。请阅读E.Dijkstra。@RodyOldenhuis我同意你的观点,goto结构的使用直接取自库中的一个例子。嗯……好吧,奇怪。好吧,那就警告你吧!:)我想您需要
strdup()
newHost的数据,长度将通过
strlen()