2014-12-03 8 views
1

경로에서 파일을 가져 오려고합니다.strtok()를 사용하여 경로를 구분합니다.

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

char split_path(char *path){ 

    char *str1, *delim; 
    char buf[255]; 
    int i, max; 

    char *token = "/"; 

    for (i = 1, str1 = path; ; i++, str1 = NULL){ 
     delim = strtok(str1, token); 
     if (delim == NULL){ 
      break; 
     } 
     buf[i] = *delim; 
     max = i; 
    } 

    char last = buf[max]; 

    return last; 
} 


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

    if (argc != 3){ 
     fprintf(stderr, "Usage: %s string delim\n", argv[0]); 
     exit(EXIT_FAILURE); 
    } 

    char last = split_path(argv[1]); 

    printf("%c\n", last); 

    return 0; 
} 

내가/A/B/C/D의 입력을 입력하면 그래서, 내가 원하는 무엇 인 'D'를 반환 이 내 코드입니다. 그러나 /a/b/c/d.txt의 입력을 입력하면 '.txt'없이 'd'만 반환됩니다. 필요한 경우 'd.txt'가 필요합니다. 마지막/뒤에 첫 번째 인덱스 만 나타나는 것 같습니다. 나는 그 문제를 알아낼 수 없다. 많은 도움을 주셨습니다.

+1

은'기본 이름을하려고()'. 직접하고 싶다면'strtok()'대신'strrchr()'을 사용하십시오. – JS1

답변

0

split_path는 strtok의 마지막 좋은 결과의 첫 번째 문자를 반환합니다.

변경 split_path은 다음과 같이 ... 뭔가를 문자열을 반환하고, 약간을 수정 :

char *split_path(char *path){ 

    char *str1, *delim; 
    int i, max; 
    char *last = NULL; 

    char *token = "/"; 

    for (i = 1, str1 = path; ; i++, str1 = NULL){ 
     delim = strtok(str1, token); 
     if (delim == NULL){ 
      break; 
     } 
     last = delim; 
    } 

    return last; 
} 


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

    if (argc != 3){ 
     fprintf(stderr, "Usage: %s string delim\n", argv[0]); 
     exit(EXIT_FAILURE); 
    } 
    char *last = split_path(argv[1]); 

    printf("%s\n", last); 

    return 0; 
} 
0

나는 당신이 두 가지 방법으로 작업을 수행하는 방법을 보여 드리겠습니다. 가장 쉬운 방법은 시스템에 libgen.h을 포함하고 basename()을 사용하는 것입니다. 그것은 당신이 원하는 것을 해냅니다. 그러나 자신의 함수를 작성하려는 경우 strrchr()을 사용하면 문자열에서 마지막 문자를 찾습니다.

#include <stdio.h> 
#include <string.h> // for strrchr() 
#include <libgen.h> // for basename() 

const char *my_basename(const char *path) 
{ 
    const char *lastSlash = strrchr(path, '/'); 

    if (lastSlash) 
     return lastSlash+1; 
    return path; 
} 

int main(int argc, char *argv[]) 
{ 
    if (argc < 2) 
     return; 

    printf("Full path  = %s\n", argv[1]); 
    printf("basename() = %s\n", basename(argv[1])); 
    printf("my_basename() = %s\n", my_basename(argv[1])); 

    return 0; 
} 

샘플 출력 : 당신은 단지 경로의 마지막 부분이 필요하면

Full path = /aaa/bbb/ccc/ddd.txt 
Filename = ddd.txt 
Filename = ddd.txt