免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2386 | 回复: 4
打印 上一主题 下一主题

请问是否有标准的路径转换C函数? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-03-17 17:28 |只看该作者 |倒序浏览
譬如我有如下路径:
///usr///.///src///..///a.c
我希望将这个路径转换成/usr/src/a.c这种标准的格式,是否有这样的一个标准函数或例子函数?
自己实现一个这样的函数也不是很难,不过没有想到很好的算法,不知道各位大侠是否有好主意?

谢谢!

论坛徽章:
0
2 [报告]
发表于 2008-03-17 19:07 |只看该作者
原帖由 onlyflyer 于 2008-3-17 17:28 发表
譬如我有如下路径:
///usr///.///src///..///a.c
我希望将这个路径转换成/usr/src/a.c这种标准的格式,是否有这样的一个标准函数或例子函数?
自己实现一个这样的函数也不是很难,不过没有想到很好的算法, ...

楼主的这个路径转换出来恐怕不是/usr/src/a.c而是/usr/a.c吧.

论坛徽章:
0
3 [报告]
发表于 2008-03-17 19:13 |只看该作者

回复 #2 mymtom 的帖子

是啊,我写错了。
我自己写了个函数,贼恶心,放上来吧。
尽情鄙视我吧,如果有好的算法还请多多指教。
void formatPath(char *inPath,char *outPath)
{
  char inPathCopy[1024] = {0};
  char *cur;
  int isFirstSplash = 1;

  if (NULL == inPathCopy || NULL == outPath)
    return;

  strncpy(inPathCopy, inPath, 1024 - 1);
  cur = inPathCopy;

  /* treat '////' */

  while (*cur)
  {
    if (*cur == '/' && isFirstSplash)
    {
      cur ++;
      isFirstSplash = 0;
    }
    else if (*cur == '/' && !isFirstSplash)
    {
      *cur = -1;
      cur ++;
    }
    else
    {
      cur ++;
      isFirstSplash = 1;
    }
  }

  /* treat './' */

  cur = inPathCopy;
  while (*cur)
  {
    if (*cur == '.' && *(cur + 1) == '/' && *(cur-1) != '.')
    {
      *cur = -1;
      *(cur + 1) = -1;
      cur += 2;
    }
    else
      cur ++;
  }

  /* treat '../' */

  cur = inPathCopy;
  while (*cur)
  {
    if (*cur == '.' && *(cur + 1) == '.' && *(cur + 2) == '/')
    {
      char *temp = cur - 1;
      *cur = -1;
      *(cur + 1) = -1;
      *(cur + 2) = -1;
      while (*temp != '/')
      {
        temp --;
      }
      *temp = -1;
      temp --;
      while (*temp != '/')
      {
        *temp = -1;
        temp --;
      }
      cur +=3;
    }
    else
      cur ++;
  }

  /*  copy the formated path to <outPath> */

  cur = inPathCopy;
  while (*cur)
  {
    if (*cur != -1)
    {
      *outPath = *cur;
      outPath ++;
    }
    cur ++;
  }

  return;
}

论坛徽章:
0
4 [报告]
发表于 2008-03-17 19:19 |只看该作者
原帖由 onlyflyer 于 2008-3-17 17:28 发表
譬如我有如下路径:
///usr///.///src///..///a.c
我希望将这个路径转换成/usr/src/a.c这种标准的格式,是否有这样的一个标准函数或例子函数?
自己实现一个这样的函数也不是很难,不过没有想到很好的算法, ...


realpath(src,des)
或者你非要动手写的话:
sed 's/\/\/\//\//g'
最好不要自己写判断,有linux当然好好利用正则表达式

[ 本帖最后由 NalaGinrut 于 2008-3-17 19:51 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2008-03-17 23:10 |只看该作者

回复 #4 NalaGinrut 的帖子

多谢
可惜我是要在非linux平台下实现这个功能,没有realpath,只好自己写了。
不过可以参考以下realpath的算法
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP