Как извлечь содержимое между указанным c символом в строке c? - PullRequest
0 голосов
/ 01 мая 2020

Скажите, у меня есть char ch[] = "/user/dir1/file.txt";

Я хочу использовать al oop, такой что:

1-я итерация:

prints: "user"

2-я итерация:

prints: "dir1"

3-я итерация:

prints: "file1.txt"

достичь конца строки. Существует l oop

Ответы [ 3 ]

2 голосов
/ 01 мая 2020

Вы должны использовать strtok или его потокобезопасную версию, если вы разрабатываете многопоточную программу:

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

int main() {
   char ch[] = "/user/dir1/file.txt";
   // Extract the first token
   char * token = strtok(ch, "/");
   // loop through the string to extract all other tokens
   while( token != NULL ) {
      printf( "%s\n", token ); //printing each token
      token = strtok(NULL, " ");
   }
   return 0;
}
0 голосов
/ 01 мая 2020

«Простое», переносимое, поточно-ориентированное решение, которое не изменяет строку, как подход, использующий strtok(). Таким образом, приведенный ниже подход может быть применен и к литералам!

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

int main(void)
{
  const char * s = "/user/dir1/file.txt";

  for (const char * ps = s, *pe;
    pe = strchr(ps, '/'), ps != pe ?printf("%.*s\n", (int) (pe - ps), ps) :0, pe;
    ps = pe + 1);
}

Единственное ограничение, с которым сталкивается этот код, состоит в том, что токены в анализируемой строке не должны быть длиннее INT_MAX символов.

0 голосов
/ 01 мая 2020

Непереносимая, но поточно-ориентированная альтернатива, использующая strsep :

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

extern char *strsep(char **, const char *);

int main(void)
{
    char str[] = "/user/dir1/file.txt";
    char *ptr = str, *tok;

    while ((tok = strsep(&ptr, "/")))
    {
        if (*tok) printf("%s\n", tok);
    }
    return 0;
}

Если ваша платформа не поддерживает strsep, очень легко реализовать вашу собственную функцию:

char *tokenize(char **str, int del)
{
    char *res = *str, *ptr = res;

    if (ptr == NULL)
    {
        return NULL;
    }
    while ((*ptr != del) && (*ptr != '\0'))
    {
        ptr++;
    }
    if (*ptr != '\0')
    {
        *ptr = '\0';
        *str = ptr + 1;
    }
    else
    {
        *str = NULL;
    }
    return res;
}

позвоните, используя:

while ((tok = tokenize(&ptr, '/')))
...