関数 vsprintf の使用時に問題が発生しています。
XML ファイルを開く、閉じる、書き込む 3 つの関数があります。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>
ありがとうございました。