从路径中删除字符(cstring)

时间:2014-04-29 12:15:20

标签: c linux filesystems cstring

我有一个文件列表,但有些看起来像这样:

Got file //efi/./refit/icons/tool_rescue.icns

问题是,我需要计算文件的级别深度(意思是,计算/。)我想从字符串中删除不需要的./,//等。下面是我现在的代码。唯一的问题是,随着它的运行,我得到了一些这样的路径

Got file /Users/.bin/tcsh

该文件似乎是/Users/../bin/tcsh。我知道这个功能是一个好的开始,但在正确的方向上提供一点帮助会很好。

void minimize_path(char *s)
{
    int i, j;
    do
    {
        for (i = 0; i < strlen(s); i++)
        {
            if (s[i] == '/' && s[i + 1] == '/') //double /
                for (j = i; j < strlen(s) + 1; j++)
                    s[j] = s[j + 1];
            if (s[i] == '.' && s[i + 1] == '/')
                for (j = i; j < strlen(s) + 1; j++)
                    s[j] = s[j + 2];
        }
    } while (strstr(s, "//") != NULL);
}

1 个答案:

答案 0 :(得分:1)

这消除了双点:

     if (s[i] == '.' && s[i + 1] == '/')
            for (j = i; j < strlen(s) + 1; j++)
                s[j] = s[j + 2];

也许这会更好地验证没有前一个点:

     if ((i == 0 || (i > 0 && s[i-1] != '.')) && s[i] == '.' && s[i + 1] == '/')
            for (j = i; j < strlen(s) + 1; j++)
                s[j] = s[j + 2];

注意:如果您想以“正确的方式”执行此操作,您可能需要查看lexical analysistokenization

如果您可以使用可用的库函数,则

realpath是另一种选择:

reuts@reuts-K53SD:~/cc$ cat test.c 
#include <stdio.h>
#include <limits.h> // PATH_MAX

int main(int argc, char ** argv)
{

        char rp[PATH_MAX+1];
        realpath("/usr/../usr/./bin", rp);
        printf("%s\n", rp);

        return 1;
}
reuts@reuts-K53SD:~/cc$ gcc test.c && ./a.out 
/usr/bin