我在C中有一个包含文件路径的字符串,如“home / usr / wow / muchprogram”。
我在C中想知道如何在最后一个“/”之后获取字符串。那么我可以将它存储为变量。该变量将等于“多程序”,以便明确。
我也想知道如何在最终的“/”之前获得所有内容。提前谢谢。
答案 0 :(得分:1)
从头开始扫描字符串。一旦你/
停止了。请注意index
并从index+1
复制到last_index
到新数组。
您也可以在最终/
之前获得所有内容。你有index
。开始从start_index
复制到index-1
,再到新阵列。
答案 1 :(得分:0)
从字符串末尾向后搜索,直到找到'/'
。从那里开始指向下一个索引的指针是之后的所有内容的字符串。如果您将所有内容(但不包括'/'
复制到另一个字符串中(或将'/'
替换为'\0'
),则会在上一个{{1}之前获取所有内容的字符串}。
答案 2 :(得分:0)
其他人已经提出了这个建议,但是他们忘了包含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;
}
答案 3 :(得分:0)
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;
}
答案 4 :(得分:0)
您可以在c#中解决此问题,如下所示..
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提高效率。