[C con Clase] Mascara para sscanf

Leonel Florín Sellés leonel06033 en cfg.jovenclub.cu
Jue Ene 10 16:49:03 CET 2008


Hola lista:

  Tengo un problema al leer cadenas con sscanf. Tengo un cadena de
caracteres que tiene esta forma:

   hasaslfjkalfjaldfjalñfkaj?\nañlfjkañlfjañlfjafkljasfkl?\nafkljañlfjañlfjafdfljañlfjadflaj?\n

Y tengo que separarlas por el interrogante. Lo que primero pense es
utilizar sscanf de la siguiente manera:
  sscanf (cadena_origen,"%[^?]?\n",cadena_destino)

Hasta aqui bien pero mi sorperesa es que de pronto me empezaron a
llegar cadenas que tenian el caracter ? intercalado del estilo

asfljaslfjalf???alsfjañlfjs?\nañlfjkañlfjañlfjalkfj????alsfjalf?\n

Ahora tengo que conseguir dividir la cadena por el interrogante mas
el salto de linea. ¿Alguien me puede decir cual seria la mascara de
sscanf correcta?

Muchas gracias


----------------------------------

Bueno amigo, como ya otros te han recomendado, to te aconsejo la
function strtok, que te explico como trabaja.

la function de cabecera es:

char *strtok(char *s1, const char *s2);

descripción:
una "secuencia de llamdas" a strtok() divide la cadena S1 en saltos
o tokens (partes lógicas), como palabras, en ua línea de texto,
saparados por caracteres, contenidos en la cadena S2, la primera
lamada contiene s1 como primer argumento, y las llamadas seguidas de
la primera, para continuar esa divición de la misma cadena,
contienen NULL como primer argumento, para cada llamada se regresa
un apuntador al token o ficha actual, si si cuando la funtion es
llamada ya no hay mas token o fichas, se regresa null.

a la function esta en la biblioteca "string.h"
aqui te pongo un ejemplo:

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

main()
{
   char string[]= "esta es una sentencia con 7 token";
   char *tokenPtr;

   printf("La cadena a dividir es:\n &s\n", string);

   tokenPtr = strtok(string, " ");

   while (tokenPtr != NULL){
      printf("%s\n", tokenPtr);
      tokenPtr = strtok(NULL, " ");
   }//del while
}

descripción del ejercicio:

la funtion se utiliza para dividir una cadena en palabras o tokens,
un token es una serie de caracteres separados por caracteres
delimitantes, determinados por uno mismo, por ejemplo en una linea
de texto, cada palabra puede ser considerada como un token, y los
espacios en blancos que separan las palabras pueden ser considerados
delimitantes.
Se requiere de multiples llamadas a strtok() para dividir una cadena
en tokens (suponiendo que la cadena contenga mas de uno de ellos), 
la primera llamada a strtok() contiene dos argumentos, la primera es
la cadena que va a ser dividida, y la seguda una cadena que contiene
los caracteres que separaran a los token o palabras, el enunciado

tokenPtr = strtok(string, " ");

asigna a tokenPtr un aputador al primer token en string, el segundo
argumento de strtok " ", indica que los token o palabras en string
estan dividos por espacios en blanco, si se pone otro caracter,
entonces se separara la cadena string por el caracter o cadena que
pongamos, esto iniciara el primer token, la funtion a continuación
encuentra el siguiente caracter delimitante dentro de la cadena y lo
reemplaza con un caracter nulo ('\0'), con esto se da por terminado
el token o palabra actual, la funtion strtok() guarda un apuntador
al caracter que sigue al token o palabra en string, y regresa un
apuntador al token o palabra actual.
la siguente llamada a strtok(), para continuar la divición de
string,  contiene a NULL como primer argumento, este argumento
indica a strtok() que debera continuar la divición a partir de la
localización en string, guardada por la ultima llamada a strtok(),
si despues de llamar a strtok ya no quedan tokens, strtok() regresa
NULL, por esto es que en el siclo se pone while (tokenPrt != NULL)
para cuando llege al final pare.

a otra cosa, la funtion modifica la cadena original es decir string.

bueno amigo, espero esto te sirva para algo, toda esta explicacion
la tome de un libro que tengo, que lo explica bien claro.

saludos si tienes dudas solo prgunta.









Más información sobre la lista de distribución Cconclase