問題

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

〔プログラムの説明〕
 与えられたパスを絶対パスに変換する関数convertである。

 階層構造をもつファイルシステムにおいて,ファイルやディレクトリを特定する文字列をパスという。ルートディレクトリを基準としたパスを絶対パスと呼び,“/”から始まり,各階層を“/”で区切っていく。与えられたパスがディレクトリのとき,最後の“/”はあってもなくてもよい。例えば,図のディレクトリeの絶対パスは“/a/d/e”又は“/a/d/e/”で示す。

 一方,カレントディレクトリを基準としたパスを相対パスと呼び,相対パスを指定するときに階層を一つ上にたどる場合は“..”を用いる。例えば,図においてディレクトリcをカレントディレクトリにした場合,ファイルfile1.txtの相対パスは“../file1.txt”,ディレクトリeの相対パスは“../../d/e”又は“../../d/e/”となる。また,カレントディレクトリ自身は“.”又は“./”で示す。

(1)関数の仕様は,次のとおりである。
void convert( const char *path,
       const char *base,
       char *result);
引数:path 変換前のパス
   base カレントディレクトリの絶対パス
   result 変換後の絶対パス
機能:pathが相対パス表記であれば,baseを基準にした絶対パス表記に変換し,resultに格納する。pathが絶対パス表記であれば,resultにはbaseに関係なくpathをそのまま格納する。
返却値:なし。

 ただし,resultが参照する領域は,変換後の文字列を格納するのに十分であるとする。また,冗長なパス又はパスとして認識できない文字列が引数として与えられることはないものとする。

(2)ファイルシステム上に,指定されたディレクトリやファイルが実際に存在するかどうかのチェックは行わない。

(3)変換例を表1に示す。

(4)次のライブラリ関数を用いる。

unsigned int strlen(const char *s);
 機能:文字列sの長さを計算する。
 返却値:終端を示すナル文字に先行する文字の個数を返す。

int strcmp(const char *s1, const char *s2);
 機能:文字列s1と文字列s2を比較する。
 返却値:s1とs2が同一文字列の場合は0,それ以外の場合は0以外を返す。

int strncmp(const char *s1, const char *s2, int n);
 機能:文字列s1と文字列s2を先頭からn文字,又はナル文字までを比較する。
 返却値:比較したn文字が同一の場合は0を,それ以外の場合(比較が途中で終了した場合も含む)は0以外を返す。

char *strcpy(char *s1, const char *s2);
 機能:文字列s1に文字列s2をナル文字まで複写する。
 返却値:s1

char *strncpy(char *s1, const char *s2, int n);
 機能:文字列s1に文字列s2をn文字複写する。s2の長さがn以上の場合はn文字目までを複写し,n未満の場合は残りをナル文字で埋める。
 返却値:s1