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

时间:2014-02-24 03:53:48

标签: c string

我在C中有一个包含文件路径的字符串,如“home / usr / wow / muchprogram”。

我在C中想知道如何在最后一个“/”之后获取字符串。那么我可以将它存储为变量。该变量将等于“多程序”,以便明确。

我也想知道如何在最终的“/”之前获得所有内容。提前谢谢。

5 个答案:

答案 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提高效率。