+ -
当前位置:首页 → 问答吧 → 百度实习生应聘:网试题 (路径解析)

百度实习生应聘:网试题 (路径解析)

时间:2010-07-13

来源:互联网

本帖最后由 xunen 于 2010-07-13 21:37 编辑

大概是怎样的:用 C 语言实现一个 UNIX 路径解析函数。
例如:输入:/abc/../k    输出:/k
      输入:./abc/./k     输出:abc/k


我想就是能合理理解 “./”和 “../”吧。

作者: xunen   发布时间: 2010-07-13

堆栈

作者: benjiam   发布时间: 2010-07-13

输入:/abc/../k 的输出行为很诡异,很有百度风范。

作者: 没本   发布时间: 2010-07-13

本帖最后由 xunen 于 2010-07-13 21:41 编辑


QUOTE:
输入:/abc/../k 的输出行为很诡异,很有百度风范。
没本 发表于 2010-07-13 21:32




输入:/abc/../k    输出:/abc
=====>>>
输入:/abc/../k    输出:/k

不好意思,写错了



翻看Andrew S. Tanenbaum大师写的《操作系统设计与实现》文件系统那一章,是采用多个函数并结合读取磁盘i节点方式实现的。在这里好像不适用。

作者: xunen   发布时间: 2010-07-13

回复 xunen


    死一点的方法, 一个字符一个字符处理,状态也不多。。
    这个,应该用词法分析去做?估计百度才会招你去实习。

作者: peidright   发布时间: 2010-07-13

本帖最后由 xunen 于 2010-07-13 22:06 编辑

char *real_path(const char *path, char *done_path)

逐个分析path,遇到“./”,跳过;遇到“../”,当前指针指向上一个路径的结尾
(当然用一个变量记录当前路径的结尾)。看行不行?个人觉得用堆栈很麻烦。词法分析是什么,不太懂。

作者: xunen   发布时间: 2010-07-13

url归并?

作者: mirnshi   发布时间: 2010-07-13

回复 xunen


    大概就这样子,程序不多,搂主写出来吧。 大概过程,可以这样, 搜索 "." ,搜索到第一个点的时候, 看下一个符号是什么, 如果又是.
采取某种行动, 如果是/ 采取某种行动,等等, 处理完了,继续搜索下一个点, 直到搜索完成。

作者: peidright   发布时间: 2010-07-13

看内核是怎么解析的,很好的参考。/usr/src/linux/fs/namei.c

static int link_path_walk(const char *name, struct nameidata *nd)

太长我不贴了,有兴趣的自己找来读吧,这段代码不难。

作者: 没本   发布时间: 2010-07-13