2014-04-29 3 views
0

나는 파일의 목록을 가지고 있지만, 일부는 다음과 같습니다 :제거 문자

Got file //efi/./refit/icons/tool_rescue.icns 
문제가

, 나는/계산, 파일의 레벨 깊이 (의미를 계산해야 's). 문자열에서 불필요한 ./, // // 등을 제거하고 싶습니다. 아래 코드는 지금 가지고있는 코드입니다. 유일한 문제는 그것이 실행하는, 내가 파일 /Users/../bin/tcsh 것 같았다이

Got file /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

가 왜'realpath (3)'을 사용하지 않는 : 당신이 사용할 수있는 라이브러리 함수를 사용할 수 있는지

realpath

는 또 다른 옵션입니까? –

답변

1

이 이중 점 제거 :

 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]; 

참고 :

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

을 어쩌면 이것은 위의 점은 없었다 확인하는 것이 좋습니다 수 있습니다 당신이 원하는 경우 이 "올바른 방법"은 lexical analysistokenization입니다.

[email protected]:~/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; 
} 
[email protected]:~/cc$ gcc test.c && ./a.out 
/usr/bin