我用C语言有一个字符串,包含了文件路径,例如:"home/usr/wow/muchprogram"。
我想知道如何在C语言中获取最后一个"/"之后的字符串,然后把它存储为一个变量。这个变量应该是"muchprogram"。
同时,我还想知道如何获取最后一个"/"之前的所有内容。谢谢!
我用C语言有一个字符串,包含了文件路径,例如:"home/usr/wow/muchprogram"。
我想知道如何在C语言中获取最后一个"/"之后的字符串,然后把它存储为一个变量。这个变量应该是"muchprogram"。
同时,我还想知道如何获取最后一个"/"之前的所有内容。谢谢!
有人已经建议过这个,但他们忘了包括C。这假设对源字符串进行突变是可以的。使用GCC 4.7.3进行测试。
#include <stdio.h>
#include <string.h>
int main() {
char* s = "home/usr/wow/muchprogram";
int n = strlen(s);
char* suffix = s + n;
printf("%s\n%s\n", s, suffix);
while (0 < n && s[--n] != '/');
if (s[n] == '/') {
suffix = s + n + 1;
s[n] = '\0';
}
printf("%s\n%s\n", s, suffix);
return 0;
}
/
,停止扫描。注意index
并将index+1
到last_index
之间的内容复制到一个新数组中。/
之前的所有内容。你已经有了index
。从start_index
到index-1
之间的内容复制到一个新数组中。strrchr(3)
自C89以来就一直存在,用于此目的。
#include <stdio.h>
#include <string.h>
static void find_destructive(char *s) {
char *p_sl = strrchr(s, '/');
if (p_sl) {
*p_sl = '\0';
printf("[%s] [%s]\n", s, p_sl + 1);
} else {
printf("Cannot find any slashes.\n");
}
}
static void find_transparent(const char *s) {
const char *p_sl = strrchr(s, '/');
if (p_sl) {
char *first = (char *)malloc(p_sl - s + 1);
if ( ! first) {
perror("malloc for a temp buffer: ");
return;
}
memcpy(first, s, p_sl - s);
first[p_sl - s] = '\0';
printf("[%s] [%s]\n", first, p_sl + 1);
free(first);
} else {
printf("Cannot find any slashes.\n");
}
}
int main() {
char s[] = "home/usr/wow/muchprogram";
find_transparent(s);
find_destructive(s);
return 0;
}
find_transparent
中用以下内容替换整个if (p_sl)
的then分支:printf("[%.*s] [%s]\n", (int)(p_sl - s), s, p_sl + 1);
这样就可以避免使用malloc
、memcpy
等。 - Arkku从字符串末尾开始向后搜索,直到找到一个'/'
。从那里的下一个索引指针是该字符之后的所有内容。如果将除了'/'
之外的所有内容复制到另一个字符串中(或用'\0'
替换'/'
),则可以获得最后一个'/'
之前的所有内容的字符串。
Var tokens = Str.Split('/');
Var lastItem = tokens[tokens.Length-1];
Var everythingBeforeLastItem = string.Empty;
Enumerate.Range(0,tokens.Length-3).ToList().
ForEach(i => everythingBeforeLastItem = everythingBeforeLastItem+tokens[i]+"\");
EverythingBeforeLastItem += tokens[tokens.Length-2];
如果您预计会得到大量令牌并导致更深的路径,可以使用 StringBuilder 来提高效率。