Saltar al contenido

En c split char * en espacios con la función strtok, excepto si está entre comillas

Solución:

strtok o cualquier otra función en la biblioteca C estándar no puede hacer esto por usted. Para obtenerlo, debe escribir el código usted mismo o debe encontrar algún código existente en alguna biblioteca externa.

Esta función toma caracteres delimitadores, openblock y closeblock. Los caracteres delimitadores se ignoran dentro del bloque y los caracteres del bloque de cierre deben coincidir con los caracteres del bloque de apertura. El ejemplo se divide en espacios y bloques se definen mediante comillas y corchetes, llaves y <>. ¡Gracias a Jongware por sus comentarios!

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

char *strmbtok ( char *input, char *delimit, char *openblock, char *closeblock) {
    static char *token = NULL;
    char *lead = NULL;
    char *block = NULL;
    int iBlock = 0;
    int iBlockIndex = 0;

    if ( input != NULL) {
        token = input;
        lead = input;
    }
    else {
        lead = token;
        if ( *token == '') {
            lead = NULL;
        }
    }

    while ( *token != '') {
        if ( iBlock) {
            if ( closeblock[iBlockIndex] == *token) {
                iBlock = 0;
            }
            token++;
            continue;
        }
        if ( ( block = strchr ( openblock, *token)) != NULL) {
            iBlock = 1;
            iBlockIndex = block - openblock;
            token++;
            continue;
        }
        if ( strchr ( delimit, *token) != NULL) {
            *token = '';
            token++;
            break;
        }
        token++;
    }
    return lead;
}

int main (int argc , char *argv[]) {
    char *tok;
    char acOpen[]  = {""[<{"};
    char acClose[] = {""]>}"};
    char acStr[] = {"this contains blocks "a [quoted block" and a [bracketed "block] and <other ]" blocks>"};

    tok = strmbtok ( acStr, " ", acOpen, acClose);
    printf ( "%sn", tok);
    while ( ( tok = strmbtok ( NULL, " ", acOpen, acClose)) != NULL) {
        printf ( "%sn", tok);
    }

    return 0;
}

producción
esta
contiene
bloques
“a [quoted block”
and
a
[bracketed “block]

y

No tuve suerte usando strtok().

Oportunidad divertida de emplear una máquina de estado.

#include <stdio.h>

void printstring(const char *frm, const char *to) {
  fputc('<', stdout);  // <...>n Added for output clarity
  while (frm < to) {
    fputc(*frm++, stdout);
  }
  fputc('>', stdout);
  fputc('n', stdout);
}

void split_space_not_quote(const char *s) {
  const char *start;
  int state=" ";
  while (*s) {
    switch (state) {
      case 'n': // Could add various white-space here like f t r v
      case ' ': // Consuming spaces
        if (*s == '"') {
          start = s;
          state=""";  // begin quote
        } else if (*s != ' ') {
          start = s;
          state="T";
        }
        break;
      case 'T': // non-quoted text
        if (*s == ' ') {
          printstring(start, s);
          state=" ";
        } else if (*s == '"') {
          state="""; // begin quote
        }
        break;
      case '"': // Inside a quote
        if (*s == '"') {
          state="T"; // end quote
        }
        break;
    }
    s++;
  } // end while
  if (state != ' ') {
    printstring(start, s);
  }
}

int main(void) {
  split_space_not_quote("Insert "hello world" to dbms");
  return 0;
}

<Insert>
<"hello world">
<to>
<dbms>
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *