challenge 擬似lsの実装

スラッシュで区切られた文字列の配列(以下パスリスト)がある。
このパスリストにたいして擬似的なlsを行いたい。
lsはパスリストと表示対象ディレクトリのパスを入力する。

例としては以下のようになる。
pathList = ["aaa/bbb","aaa/ccc","aaa/ddd/eee","bbb/ddd/eee"]

ls(pathList,"aaa/")
>["bbb","ccc","ddd/"]

ls(pathList,"aaa/ddd/")
>["eee"]

なおパスリストが大きくなったとき、速度がなるべく低下しないように実装するのが望ましい。
文字列は任意の文字コードであると仮定してかまわない。

Posted feedbacks - C

コメントといえばCで文字列処理をかくとポインタ演算だらけになるなあ、ということくらいか。
あとリスト処理が面倒・・・。
※リストの最後にNULLターミネータを付加
※結果はstdoutにしちゃいました
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <stdio.h>
#include <string.h>

#define PATH_MAX 256
const char *pathList[] = {"aaa/bbb", "aaa/ccc", "aaa/ddd/eee", "bbb/ddd/eee", NULL};

void ls(const char **list, const char *dir){
    char buf[PATH_MAX], *p;
    size_t dirlen = strlen(dir);
    while(*list){
        if(strncmp(*list, dir, dirlen) == 0){
            strcpy(buf, *list + dirlen);
            p = buf;
            while(*p){
                *(p+1) = (*p == '/') ? '\0' : *(p+1);
                p++;
            }
            puts(buf);
        }
        list++;
    }
}

int main(){
    ls(pathList, "aaa/");
    putchar('\n');
    ls(pathList, "aaa/ddd/");
    return 0;
}

Index

Feed

Other

Link

Pathtraq

loading...