我在使用函数 vsprintf 时遇到问题。
我有 3 个函数来打开、关闭和写入 XML 文件。open 函数将输入文本的第一个单词存储在一个数组中,close 函数关闭带有该单词的标签。问题是我存储要使用的关闭标记的数组在每次调用打开或写入函数时都会被覆盖(即使写入函数没有对用于存储关闭标记的数组的任何引用)。
int xml_level = 0;
char *xml_header[64];
FILE *xml_out;
void xmlopen(const char *format, ...){
char buffer[256];
va_list arglist;
va_start(arglist,format);
vsprintf(buffer,format,arglist);
va_end(arglist);
int i;
for(i=0; i<xml_level; i++){
fprintf(xml_out,"\t");
}
fprintf(xml_out,"<%s>\n",buffer);
xml_header[xml_level] = strtok (buffer, " ");
xml_level++;
}
void xmlclose(){
xml_level--;
int i;
for(i=0; i<xml_level; i++){
fprintf(xml_out,"\t");
}
fprintf(xml_out,"</%s>\n",xml_header[xml_level]);
}
void xmlwrite(const char *format, ...){
char buffer[256];
va_list arglist;
va_start(arglist,format);
vsprintf(buffer,format,arglist);
va_end(arglist);
int i;
for(i=0; i<xml_level; i++){
fprintf(xml_out,"\t");
}
fprintf(xml_out,"<%s/>\n",buffer);
}
使用示例:
xmlopen("Hello Word");
xmlopen("Foo Bar");
xmlwrite("Potato");
xmlwrite("Sentence longer than the other ones");
xmlclose();
xmlclose();
输出示例:
<Hello Word>
<Foo Bar>
<Potato/>
<Sentence longer than the other ones/>
</Sentence longer than the>
</Sentence longer than the>
它应该在哪里:
<Hello Word>
<Foo Bar>
<Potato/>
<Sentence longer than the other ones/>
</Foo>
</Hello>
谢谢你。