2017-11-21 37 views
0

의 구분에 의해 문자열,
즉 "수준 1", "레벨 2" "level3", "level4".분할 경로</p> 나는 각각의 항목을 검색 할 수 있도록이 문자열을 분할 할 수 있도록하려는 <pre><code>/level1/level2/level3/level4 </code></pre> <p>을 감안할 때 C

내 첫 번째 아이디어는 strtok을 사용했지만 분명히 대부분의 사람들은이 기능을 사용하여에 대해 을 권장합니다. 또 다른 방법은 string (char* path)을 전달하고 각 항목을 "/"로 나눌 수있는 방법입니다.

+0

그것에 대해 자신의 기능을 작성하는 방법은 무엇입니까? – Cherubim

+0

'strtok'에 대한 정보 – Michi

+1

'strtok'의 유일한 문제점은 호출 한 문자열을 수정한다는 것입니다. 만약 당신이 그걸로 괜찮다면 (그리고 문자열은'const'가 아니다) 문제가 없다. –

답변

3

유닉스 경로를 분할하는 것은 단지 /으로 분할하는 것 이상입니다. 이 모든

  • 많은 복잡한 작업과 마찬가지로 /foo/bar/baz/
  • /foo/bar/baz
  • /foo//bar/baz

... 같은 경로를 참조하십시오, 그것은 스스로 할 것이 아니라 기존 기능을 사용하지 않는 것이 좋습니다 . 이 경우에는 POSIX dirnamebasename 기능이 있습니다.

  • dirname
  • basename 당신은 유닉스 경로를 분할 할 수 있습니다, 함께 다음을 사용하여 파일 경로

의 마지막 부분을 반환하는 파일 경로에서 상위 경로를 반환합니다.

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <libgen.h> 

int main(void) { 
    char filepath[] = "/foo/bar//baz/"; 

    char *fp = filepath; 
    while(strcmp(fp, "/") != 0 && strcmp(fp, ".") != 0) { 
     char *base = basename(fp); 
     puts(base); 

     fp = dirname(fp); 
    } 

    // Differentiate between /foo/bar and foo/bar 
    if(strcmp(fp, "/") == 0) { 
     puts(fp); 
    } 
} 

// baz 
// bar 
// foo 
///

그것은 아니에요 가장 효율적인, 그것은 캐릭터를 통해 여러 패스를 수행하지만 올바른입니다.

4

strtok은 실제로 이와 같은 문자열을 토큰 화하는 데 선호되는 방법입니다. 당신은 알고 있어야합니다 :

  • 원래 문자열이
  • 함수는 파싱하는 동안 정적 데이터를 사용하여 수정, 그래서 스레드로부터 안전하지 않습니다 그리고 당신은 두 개의 분리 된 문자열의 구문 분석을 인터리브 수 없습니다.

원래 문자열을 수정하지 않으려면 strdup을 사용하여 복사 한 다음 필요에 따라 결과를 복사하십시오. 여러 스레드 또는 인터리빙 된 사용에 대해 걱정할 필요가있는 경우 추가 상태 매개 변수가있는 strtok_r을 대신 사용하십시오.

+0

그래, 아마 괜찮을거야,'char []'(https://ideone.com/p2H6WX)가 올 때,'const char * ptr'에 문제가 될 것이다 – Michi

+0

[내 대답] (https://stackoverflow.com/a/47421849/14660),'/'로 쪼개는 것보다 유닉스 경로를 더 많이 나눌 수 있습니다. – Schwern