zoukankan      html  css  js  c++  java
  • Unix路径解释函数

    今天在chinaunix论坛上看到一道百度实习生网试题

    地址为:http://bbs.chinaunix.net/viewthread.php?tid=1748427&extra=&page=1

    题目如下:

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

    论坛上有个人给了一段代码,我看了一下发现是错误的。就有个人说可以参考Linux内核的函数处理如下:

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

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

    我到Linux里看了一下这个函数,非常长,挺复杂,没有看下去,就自己写了一个,最近时间太忙,没时间写注释,过阵子忙过了再回来补上

    代码如下:

    代码
    1 #include <stdio.h>
    2 #include <stdlib.h>
    3 #include <string.h>
    4
    5  char * backroll(char *str,char *p)
    6 {
    7 int flag = 0;
    8 while(*p !='/' && p != str && str!= NULL || flag != 1)
    9 {
    10 if(*p == '/')
    11 {
    12 flag++;
    13 }
    14 p--;
    15 }
    16 if(p == str)
    17 {
    18 *p = '/';//假设超出当前目录的上层未知目录为根目录
    19   }
    20 return p+1;
    21 }
    22
    23  char * path(char * v_str)
    24 {
    25 int len;
    26 len = strlen(v_str) + 1;
    27 char *p = (char *)malloc(len);
    28 memset(p,0,len);
    29 char *end = v_str + len - 1;
    30 char *ret = p;
    31 while (*v_str != NULL)
    32 {
    33 if(*v_str == '.')
    34 {
    35 if(*(v_str+1) == '.')
    36 {
    37 p = backroll(ret,p);
    38 if(v_str+3 < end)
    39 {
    40 v_str+=3;
    41 continue;
    42 }
    43 else
    44 break;
    45 }
    46 else if(*(v_str+1) == '/')
    47 {
    48 if(v_str+2 < end)
    49 {
    50 v_str+=2;
    51 continue;
    52 }
    53 else
    54 break;
    55 }
    56 }
    57 *p=*v_str;
    58 p++;
    59 v_str++;
    60
    61 }
    62 *(p) = '\0';
    63 return ret;
    64 }
    65
    66
    67  void main()
    68 {
    69 char *str1 = "/abc/../k/m/.././";
    70 char *str2 = "./abc/./k";
    71 char *p1,*p2;
    72 p1 = path(str1);
    73 printf("%s\n",p1);
    74 free(p1);
    75 p2 = path(str2);
    76 printf("%s\n",p2);
    77 free(p2);
    78 }

    允行结果为:

    /k/

    abc/k

    我用其他的路径验证了一下,没发现什么错误,如果有错,希望大家指出来,一起学习。

  • 相关阅读:
    [LeetCode] Range Sum Query
    [LeetCode] Longest Increasing Subsequence
    [LeetCode] Bulls and Cows
    [LeetCode] Serialize and Deserialize Binary Tree
    [LeetCode] Find Median from Data Stream
    [LeetCode] Convert Sorted List to Binary Search Tree
    [LeetCode] Nim Game
    [LeetCode] Word Pattern
    安装配置说明与注意
    java.lang.OutOfMemoryError: PermGen space及其解决方法
  • 原文地址:https://www.cnblogs.com/fangyu/p/1847225.html
Copyright © 2011-2022 走看看