如何在C语言中获取字符串的最后一部分

5

我用C语言有一个字符串,包含了文件路径,例如:"home/usr/wow/muchprogram"。

我想知道如何在C语言中获取最后一个"/"之后的字符串,然后把它存储为一个变量。这个变量应该是"muchprogram"。

同时,我还想知道如何获取最后一个"/"之前的所有内容。谢谢!


3
strrchr 函数能够帮助你获取斜杠符号后的最后一部分内容。 - Raghu Srikanth Reddy
您可以使用split方法通过/拆分字符串,然后访问结果。以下是如何操作的链接:http://www.cplusplus.com/reference/cstring/strtok/ - user3011902
你也可以使用正则表达式。 - Blue Ice
@RaghuSrikanthReddy 那是一个很棒的函数。有没有一个相当的函数可以获取最后一个字符之前的所有内容? - Twisterz
@Twisterz 将完整的字符串收集到一个临时指针中。在最后一个“/”处放置一个NULL。然后你就可以得到最后一个“/”之前的字符串了。 - Raghu Srikanth Reddy
5个回答

1

有人已经建议过这个,但他们忘了包括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;
}

1
从字符串末尾开始扫描。一旦遇到/,停止扫描。注意index并将index+1last_index之间的内容复制到一个新数组中。
你也要获取最后一个/之前的所有内容。你已经有了index。从start_indexindex-1之间的内容复制到一个新数组中。

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;
}

由于您的函数只是打印而不返回结果,因此您可以在find_transparent中用以下内容替换整个if (p_sl)的then分支:printf("[%.*s] [%s]\n", (int)(p_sl - s), s, p_sl + 1); 这样就可以避免使用mallocmemcpy等。 - Arkku
@Arkku 你说得对。但我认为OP的意图是获得两个零结尾的C字符串,可以在任何情况下使用。 - nodakai

0

从字符串末尾开始向后搜索,直到找到一个'/'。从那里的下一个索引指针是该字符之后的所有内容。如果将除了'/'之外的所有内容复制到另一个字符串中(或用'\0'替换'/'),则可以获得最后一个'/'之前的所有内容的字符串。


-1
你可以使用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 来提高效率。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接