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

时间:2017-01-04 11:46:13

标签: 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, &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_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 newb。

1 个答案:

答案 0 :(得分:1)

Libyaml期望可以通过free()删除每个标量的值。因此,您需要使用malloc() ed memory初始化此值:

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