1

Say I have a const char* string like this:

../products/product_code1233213/image.jpg

I want to retrieve the second last part of this path string, which is the parent folder name of the jpg file, how would I do that?

dulan
  • 1,584
  • 6
  • 22
  • 50
  • This might be helpful: http://stackoverflow.com/questions/9210528/split-string-with-delimiters-in-c – Ruslan Oct 18 '14 at 06:43

3 Answers3

2

You can use strtok.

#include <string.h>
#include <stdio.h>

int main()
{
   char str[] = "/products/product_code1233213/image.jpg";
   char s[2] = "/";
   char *token;

   /* get the first token */
   token = strtok(str, s);

   /* walk through other tokens */
   while( token != NULL ) 
   {
      printf( " %s\n", token );

      token = strtok(NULL, s);
   }

   return(0);
}

Output:

products
product_code1233213
image.jpg
Jayesh Bhoi
  • 24,694
  • 15
  • 58
  • 73
1

This version works with a const char *:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    const char *s = "/products/product_code1233213/image.jpg";
    const char *p = s, *begin = s, *end = s;
    char *result;
    size_t len;

    while (p) {
        p = strchr(p, '/');
        if (p) {
            begin = end;
            end = ++p;
        }
    }
    if (begin != end) {
        len = end - begin - 1;
        result = malloc(len + 1);
        memcpy(result, begin, len);
        result[len] = '\0';
        printf("%s\n", result);
        free(result);
    }
    return 0;
}
David Ranieri
  • 39,972
  • 7
  • 52
  • 94
0

Using only strchr() and no backtracking. Fast and const-safe.

#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define SEPARATOR '/'

const char *path = "../products/product_code1233213/image.jpg";

int main(void) {
    const char *beg, *end, *tmp;

    beg = path;
    if ((end = strchr(beg, SEPARATOR)) == NULL) {
        exit(1); /* no separators */
    }
    while ((tmp = strchr(end + 1, SEPARATOR)) != NULL) {
        beg = end + 1;
        end = tmp;
    }
    (void) printf("%.*s\n", (int) (end - beg), beg);
    return 0;
}
potrzebie
  • 1,768
  • 1
  • 12
  • 25