如何在C中修改现有的YAML节点?
我不是C程序员,但最近对它很感兴趣。我正在尝试使用C libyaml库修改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, &
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()