Подстрока C из строки, подобной folder1 / file1.txt - PullRequest
2 голосов
/ 29 января 2010

У меня есть строки, такие как "folder1 / file1.txt" или "foldername1 / hello.txt", и мне нужно взять подстроку, которая идентифицирует имя папки с косой чертой (/)
(пример: из "folder1 /file1.txt "Мне нужно" папка1 / ").
Не все имена папок имеют одинаковую длину. Как я могу сделать это в C ?? спасибо

Ответы [ 4 ]

3 голосов
/ 29 января 2010

Найдите последний символ '/', продвиньтесь на один символ, затем обрежьте строку. Предполагая, что строка является модифицируемой и на нее указывает char *filename;:

char *p;

p = strrchr(filename, '/');
if (p)
{
    p[1] = '\0';
}

/* filename now points to just the path */
3 голосов
/ 29 января 2010

Сначала найдите положение косой черты с помощью strchr:

char * f = "folder/foo.txt";  // or whatever
char * pos = strchr( f, '/' );

затем скопируйте в подходящее место:

char path[1000];   // or whatever
strncpy( path, f, (pos - f) + 1 );
path[(pos-f)+1] = 0;    // null terminate

Вы действительно должны написать функцию для этого, и вам нужно решить, что делать, если strchr () возвращает NULL, указывая, что косая черта не существует.

1 голос
/ 30 января 2010

Если вы работаете на машине POSIX, вы можете найти функцию dirname(), которая делает более или менее то, что вы хотите. Есть некоторые особые случаи, когда он имеет дело с этим наивным кодом, но не остерегается слов ласки в стандарте (об изменении входной строки и, возможно, возвращении указателя на входную строку или, возможно, указателя на статическую память, которую можно изменить позже).

Он (dirname ()) не сохраняет конечный слеш, который, как вы говорите, вам нужен. Однако это редко является практической проблемой; добавить косую черту между именем каталога и файлом не сложно.

1 голос
/ 29 января 2010

Вы можете использовать функцию strstr ():

char *s = "folder1/file1.txt";
char folder[100];

char *p = strstr(s, "/");
if (0 != p)
{
    int len = p - s + 1;
    strncpy(folder, s, len);
    folder[len] = '\0';
    puts(folder);
}
...