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)