我有一个文件列表,但有些看起来像这样:
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);
}
答案 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 analysis和tokenization。
如果您可以使用可用的库函数,则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