東京理科大学 infoserv[更新日]2001.11.05


問6

 次の C プログラムの説明及びプログラムを読んで,設問に答えよ。

〔プログラムの説明〕

簡単な構造をもつ文字列を解析して,要素に分解するプログラムを作成した。

(1) タグ付き文字列の構文規則を,次のように定義する。 ここで,構文の記述に用いる記号の意味を,表 1 のように定める。 また,<,> 及び / は,字句要素である。

、 表1 構文の記述に用いる記号の意味

記号

意味

::=

定義する

|

又は

{ }*

“{”と“}”で囲まれた構文要素の 0 回以上の繰返し

タグ付き文字列 ::= {タグ構造}*

タグ構造 ::= 開始タグ タグの値 {タグ構造}* 終了タグ

開始タグ ::= <タグ名>

終了タグ ::= </タグ名>

タグ名 ::= <,>,/ 及び“\0”を含まない文字列

タグの値 ::= <,>,/ 及び“\0”を含まない文字列 | 空文字列

文字列 ::= {文字}*

(2) プログラムの仕様は,次のとおりである。

 関数 parse_ml_string は,与えられたタグ付き文字列 mlstr を要素に分解して,開始タグの出現順に要素配列 elmtbl に格納する。 要素数は,変数 elmnumに格納する。 ここで,要素は次の構造体で表す。

typedef struct {

char *tag; /* タグ名 */

int depth; /* 入れ子の深さ(1,2,…) */

char *value; /* タグの値 */

} ELEMENT;

 タグ付き文字列に含まれるタグの要素数が,256 を超えることはない。

 与えられるタグ付き文字列に,構文の誤りはない。

(3) タグ構造が,別のタグ構造を含むこともある(図 1 参照)。


>図1 入れ子になったタグ構造の例

(4) 入れ子の深さは,最上位のタグ構造を 1 として, 上位から下位に向かって,1,2,3,… とする。

(5) 図 2 のタグ付き文字列に対するプログラムの実行結果は, 表 2 のとおりである。

<STUDENT>BILL<AGE>14</AGE><SCHOOL>Junior
<PLACE>Minato</PLACE></SCHOOL></STUDENT>

                 注 文字列に改行は含まない

          図2 タグ付き文字列 mlstr の値

      表2 要素配列 elmtbl

タグ名 tag

入れ子の深さ depth

タグの値 value

“STUDENT”へのポインタ

1

“BILL”へのポインタ
“AGE”へのポインタ

2

“14”へのポインタ
“SCHOOL”へのポインタ

2

“Junior”へのポインタ
“PLACE”へのポインタ

3

“Minato”へのポインタ

〔プログラム〕


#define MAXELMNUM 256
typedef struct {
    char *tag;
    int  depth;
    char *value;
} ELEMENT;
char *parse_ml_data(char *, int);
ELEMENT elmtbl[MAXELMNUM];
int elmnum = 0;
void parse_ml_string(char *mlstr)
{
    while (*mlstr != '\0') {
        mlstr = parse_ml_data(mlstr + 1, 1);
    }
}
char *parse_ml_data(char *mlstr, int level)
{
    /* 開始タグ処理 */
    elmtbl[elmnum].tag =  ;
    elmtbl[elmnum].depth = level;
    for (; *mlstr != '>'; mlstr++);
    *mlstr = '\0';
    /* タグの値処理 */
    elmtbl[elmnum].value =  ;    
    for (mlstr++; *mlstr != '<'; mlstr++);
    *mlstr = '\0';
     ;
    /* 下位のタグ構造処理 */
    while (  )
        mlstr = parse_ml_data(mlstr + 1, level + 1);
    /* 終了タグ処理 */
    for (mlstr += 2; *mlstr != '>'; mlstr++);
    return mlstr + 1;
}

設問 プログラム中の に入れる正しい答えを,解答群の中から選べ。

a,b に関する解答群

ア mlstr    イ ++mlstr    ウ mlstr + 1

エ *mlstr    オ *(++mlstr)    カ *mlstr++

キ *(mlstr + 1)

c に関する解答群

ア elmnum++    イ level++    ウ mlstr++

エ *elmnum++    オ *level++    カ *mlstr++

d に関する解答群

ア *(mlstr + 1) == '<'    イ *(mlstr + 1) != '<'

ウ *(mlstr + 1) == '/'    エ *(mlstr + 1) != '/'

オ *(mlstr + 1) == '>'    カ *(mlstr + 1) != '>'


東京理科大学 infoserv 戻る 次頁:問07