c - 从路径中删除字符 (cstring)

标签 c linux filesystems cstring

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

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

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

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);
}

最佳答案

这消除了双点:

     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

关于c - 从路径中删除字符 (cstring),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23364385/

相关文章:

c# - 无法使用 FileSystemWatcher 监视 word 文档

linux - 在Redhat服务器上,是否可以在线增加/var,如何增加?

node.js - 如何监视文件的更改并仅在更改完成后查看它们?

c - 关于从中设置字符的 NSString 新手问题

c++ - 如何在 C++ 中使用全局变量?

c - 格式参数太多 [-Wformat-extra-args]

linux shell脚本printf数字格式颜色

c - 数独网格生成器

c++ - 在cygwin上安装crosstool-ng时出错(_libintl_gettext)

linux - Bash+Expect 脚本在 crontab 中无法正常运行