Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: User en 16 Julio 2012, 09:31 am



Título: Ayuda con cadenas.
Publicado por: User en 16 Julio 2012, 09:31 am
Saludos a todos los lectores y miembros del foro, tengo una duda aunque para algunos es basica para mi es algo nuevo, intento aprender a programar C en linux y mi consulta es la siguiente :

Tengo las cadenas :

Hola como estas ?
Yo muy bien ?
Que bien!

Cual es la funcion que me permite extraer siempre la primera palabra usando como delimitador
el espacio en blanco ( Siendo el resultado : "Hola","Yo","Que"), o con algun otro caracter como delimitador, pero siempre extrayendo lo de la derecha .. gracias a quien pueda ayudarme, espero haberme dejado entender.



Título: Re: Ayuda con cadenas.
Publicado por: BlackZeroX en 16 Julio 2012, 10:50 am
usa strtok() (http://www.cplusplus.com/reference/clibrary/cstring/strtok/)

Dulces Lunas!¡.


Título: Re: Ayuda con cadenas.
Publicado por: User en 16 Julio 2012, 17:38 pm
Muchas gracias por la respuesta BlackZeroX , pero creo que no me explique bien, lo que deseo no es un array, si no separar la primera palabra de cada frase de las demas palabras, y almacenar el resultado en 2 variables, espero se me haya entendido y gracias nuevamente :)

 "Hola"                 "como estas ?"
  "Yo"                   "muy bien ?"

Algo asi es lo que deseo obtener


Título: Re: Ayuda con cadenas.
Publicado por: DickGumshoe en 16 Julio 2012, 17:45 pm
O sea, tienes tres variables:

Código:
- Hola como estas ?
- Yo muy bien ?
- Que bien!

Y de ahí quieres sacar 6 variables:

Citar
- Hola
- como estas ?
- Yo
- muy bien ?
- Que
- bien!

Si es eso, no sé si hay alguna función que haga eso. Sin embargo puedes utilizar un bucle for, y en el momento que encuentres un espacio en una de las cadenas, haces lo siguiente:

1. Copias el carácter en otra cadena
2. Eliminas el carácter.
3. Se repite el bucle hasta llegar al final.

Saludos!


Título: Re: Ayuda con cadenas.
Publicado por: do-while en 16 Julio 2012, 17:48 pm
Muchas gracias por la respuesta BlackZeroX , pero creo que no me explique bien, lo que deseo no es un array, si no separar la primera palabra de cada frase de las demas palabras, y almacenar el resultado en 2 variables, espero se me haya entendido y gracias nuevamente :)

 "Hola"                 "como estas ?"
  "Yo"                   "muy bien ?"

Algo asi es lo que deseo obtener


Y eso es lo que haces (o puedes hacer) con strtok...

¡Saludos!


Título: Re: Ayuda con cadenas.
Publicado por: BlackZeroX en 16 Julio 2012, 19:41 pm
Muchas gracias por la respuesta BlackZeroX , pero creo que no me explique bien, lo que deseo no es un array, si no separar la primera palabra de cada frase de las demas palabras, y almacenar el resultado en 2 variables, espero se me haya entendido y gracias nuevamente :)

Aun que sea lo has intentado?.

Dulces Lunas!¡.


Título: Re: Ayuda con cadenas.
Publicado por: User en 16 Julio 2012, 19:45 pm
BlackZeroX : No aun no lo hize, ando en el trabajo y aqui no tengo donde, lo hago llegando a casa y gracias por el pendiente, cuidate.


Título: Re: Ayuda con cadenas.
Publicado por: User en 16 Julio 2012, 21:54 pm
Hola a todos nuevamente ya pude resolver la duda que tenia, GRACIAS DE VERDAD A TODOS LOS QUE ME AYUDARON : BlackZeroX, do-while, DickGumshoe, aqui les dejo el modo como lo hize lo pongo para que si otra persona tenga la misma duda lo vea y de paso me revisen el codigo haber si se puede optimizar, tal vez no uso adecuadamente las variables ? .. como les dije soy nuevo haber como m quedo a opinion de ustedes


Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int main ()
  5. {
  6.  char str[] ="Hola como estas ?";
  7.  char * pch;
  8.  char * valor1;
  9.  char * valor2;
  10.  
  11.  pch = strtok (str," "); // Empiezo a buscar la 1 coincidencia del espacio en blanco
  12.  while (pch != NULL)
  13.  {
  14.    valor1 = (pch); // Aqui se almacena la 1 palabra de la frase separa por el espacio en blanco
  15.    pch = strtok (NULL, ""); // Aqui ya no le pongo el espacio en blanco porque deseo el resto de la frase completa
  16.    valor2 = (pch); // Almaceno el resto de la frase en la variable
  17.    break; // Interrumpo el bucle pues como dije solo queria obtener la 1 palabra con el espacio como delimitador
  18.  }
  19.  
  20.  printf ("Este es el 1 valor: %s\n", valor1);
  21.  printf ("Este es el 2 valor: %s\n", valor2);
  22.  return 0;
  23. }
  24.  


Bueno amigos creo que es todo, gracias !!!!!!!!!!!!


Título: Re: Ayuda con cadenas.
Publicado por: do-while en 16 Julio 2012, 22:28 pm
¡Buenas!

Asi esta bien, pero puedes hacerlo un poco menos complicado:
Código
  1. char cadena[UNA_CANTIDAD],*primera,*resto;
  2.  
  3. primera = strtok(cadena," ");
  4.  
  5. if(primera)
  6.    resto = cadena + strlen(primera) + 1; //pasamos al siguiente caracter despues del primer espacio
  7. else
  8.    //no hay espacios en blanco
  9.  

O si no estas familiarizado con la aritmetica de punteros, esta otra:
Código
  1. char cadena[UNA_CANTIDAD],*primera,*resto;
  2.  
  3. primera = strtok(cadena," ");
  4.  
  5. if(primera)
  6.    resto = &cadena[strlen(primera) + 1]; //pasamos al siguiente caracter despues del primer espacio
  7. else
  8.    //no hay espacios en blanco
  9.  

¡Saludos!


Título: Re: Ayuda con cadenas.
Publicado por: User en 16 Julio 2012, 23:38 pm
do-while Gracias por responder nuevamente, proble el codigo y va muy bien hee, aqui mi interrogante :
 Elegi el 2 ejemplo, porque no se acerca de las aritmeticas de punteros.


Código
  1. char cadena[UNA_CANTIDAD],*primera,*resto;
  2.  
  3. primera = strtok(cadena," "); // Quiere decir que en la variable primera se almacena siempre la primera palabra segun la condicion dada ?
  4.  
  5. if(primera) // Si hay un dato en en la variable primera es decir que por defecto suponemos que se obtiene el 1 valor ?
  6.    resto = &cadena[strlen(primera) + 1]; //Aqui no me queda muy claro porque usas el strlen ? hasta donde se se usa para sacar la longitud de una palabra
  7. printf ("%s\n", resto);
  8. // Y lo del else lo omiti porque siempre se habra espacios en blanco esta bien ?


Título: Re: Ayuda con cadenas.
Publicado por: do-while en 17 Julio 2012, 00:31 am
¡Buenas!

XD, ahora te explico el codigo, que veo que te faltan algunos conocimientos.

1- primera = strtok(cadena," ");

Si lees el enlace a la referencia sobre strtok que te han dejado, veras que esta llamada ignora los primeros caracteres que se encuentran en los delimitadores y empieza a contar el primer token (no se si esta palabra tiene traducciona al castellano...) desde el primer caracter que no este entre los delimitadores hasta el primer caracter que encuentre en los delimitadores. En este punto marca el delimitador encontrado con el caracter '\0', y devuelve un puntero al primer token (las siguientes llamadas funcionan igual, pero con el primer parametro NULL).

Asi si tenemos la cadena {'a','b',' ','c','\0'}, despues de esta llamada cadena quedaria:  {'a','b','\0','c','\0'} y primera seria {'a','b','\0'}

Si no encontrase el delimitadore devolveria NULL, y aqui viene la segunda parte:

2- if(primera): Si hemos encontrado un delimitador, primera apuntara a alguna parte de la memoria, y tendra un valor distinto de NULL (o distinto de cero). Las condiciones logicas en C son valores numericos. Cero o NULL significa falso y distinto de cero verdadero. Por lo tanto estamos diciendo que ejecute el codigo del if si primera es distinto de NULL (cero).

3- En esta parte he tenido un error. Ahora lo corregimos.

resto = &cadena[strlen(primera) + 1]

Tendria que ser:

resto = &cadena[strlen(cadena) + 1];

¿Porque?

Strlen nos devuelve la longitud en caracteres de una cadena. Siguiendo el ejemplo anterior, como hemos cortado el primer delimitador con un caracter nulo, se tendra que strlen(cadena) = strlen({'a','b','\0','c','\0'}) = strlen({'a','b','\0'}) = 2. cadena[2] = '\0', asi que por eso le sumo 1, para pasar al siguiente caracter despues de donde hemos cortado la cadena original.

Y el porque deberia de ser cadena el parametro de strlen y no primero, es por lo que he dicho en el primer punto: Si una cadena contiene al principio caracteres que esten contenidos entre los delimitadores, strtok los ignora y contara el primer token a partir del primer caracter de la cadena que no este contenido entre los delimitadores. Si utilizasemos primera como referencia para "saltar" esos primeros caracteres y la cadena comenzase con delimitadores, estariamos contando menos caracteres de los necesarios, en cambio utilizando cadena como parametro para strlen, nos aseguramos de que esos primeros caracteres que pueden ser delimitadores tambien se esten contando.

entonces en este caso la expresion

resto = &cadena[strlen(cadena) + 1];

seria lo mismo que resto = &cadena[3];

& nos da la direccion en memoria de una variable, por lo que estamos asignando a resto la posicion en memoria de cadena[3], que sera la cadena restante de quitar la primera parte de cadena: {'c','\0'}

Si algo no te ha quedado claro no dudes en preguntar.

¡Saludos!

PD: El else no sobraba, en la cadena que has puesto tu si que hay espacios, pero una cadema cualquiera puede no tenerlos.

Ademas, tendrias que comprobar que, despues de "quitar" la primera palabra de la cadena, el resto no sea el caracter '\0', o una cadena compuesta por espacios en blanco, tabuladores..., ya que tendrias una cadena, en principio, sin ninguna informacion util...


Título: Re: Ayuda con cadenas.
Publicado por: BlackZeroX en 17 Julio 2012, 01:47 am
Es mas optimo el que uso @User no da tantos giros innecesarios...

Código
  1.  
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5.  
  6. const char ESPACIO[] = " "; // conat char ESPACIO = ' ';
  7. const char END[] = "";
  8.  
  9. int main ()
  10. {
  11.    char CADENA[] = "Hola como estas ?";
  12.    char* ptr1 = NULL;
  13.    char* ptr2 = NULL;
  14.  
  15.    ptr1 = strtok((char*)CADENA, ESPACIO);
  16.    ptr2 = ptr1 ? strtok(NULL, END):NULL;
  17.    printf ("Este es el 1 valor: %s\n", ptr1);
  18.    printf ("Este es el 2 valor: %s\n", ptr2);
  19.    return EXIT_SUCCESS;
  20. }
  21.  
  22.  

Dulces Lunas!¡.


Título: Re: Ayuda con cadenas.
Publicado por: do-while en 17 Julio 2012, 01:57 am
Es mas optimo el que uso @User no da tantos giros innecesarios...

Dulces Lunas!¡.

??????

En lugar de tres asignaciones, una llamada a funcion (que posiblemente acceda mediante un bucle a las posiciones de la cadena para rastrear delimitadores) y una salida forzada de un bucle, estoy realizando una llamada a funcion, un desplazamiento de un puntero (y solo uno), el operador de direccion y una asignacion...

De todas maneras, voy a meter los dos codigos en bucles de 1000 repeticiones (o mas, para que tarde lo suyo) y a ver cual de los dos termina antes... Ahora pongo el codigo que utilizare y los resultados.

MODIFICADO:

El codigo:
Código
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <time.h>
  4.  
  5. #define ITER 134217728
  6.  
  7. int main ()
  8. {
  9.  char str[] ="Hola c";
  10.  char str2[] = "Hola c"; /* para sobreescribir str en cada iteracion */
  11.  char * pch;
  12.  char * valor1;
  13.  char * valor2;
  14.  int i,inicio;
  15.  
  16.    inicio = time(NULL);
  17.  
  18.    for(i = 0 ; i < ITER ; i++)
  19.    {
  20.        strcpy(str,str2);
  21.  
  22.        pch = strtok (str," "); // Empiezo a buscar la 1 coincidencia del espacio en blanco
  23.        while (pch != NULL)
  24.        {
  25.            valor1 = (pch); // Aqui se almacena la 1 palabra de la frase separa por el espacio en blanco
  26.            pch = strtok (NULL, ""); // Aqui ya no le pongo el espacio en blanco porque deseo el resto de la frase completa
  27.            valor2 = (pch); // Almaceno el resto de la frase en la variable
  28.            break; // Interrumpo el bucle pues como dije solo queria obtener la 1 palabra con el espacio como delimitador
  29.        }
  30.    }
  31.  
  32.    printf("Metodo 1: %d segundos.\n",time(NULL) - inicio);
  33.  
  34.    inicio = time(NULL);
  35.  
  36.    for(i = 0 ; i < ITER ; i++)
  37.    {
  38.        strcpy(str,str2);
  39.  
  40.        pch = strtok(str," ");
  41.  
  42.        if(pch)
  43.            valor2 = &str[strlen(str) + 1];
  44.    }
  45.  
  46.    printf("Metodo 2: %d segundos.\n",time(NULL) - inicio);
  47.  
  48.    inicio = time(NULL);
  49.  
  50.    for(i = 0 ; i < ITER ; i++)
  51.    {
  52.        strcpy(str,str2);
  53.  
  54.        pch = strtok(str," ");
  55.  
  56.        if (pch)
  57.            valor2 = strtok(NULL, "");
  58.    }
  59.  
  60.    printf("Metodo 3: %d segundos.\n",time(NULL) - inicio);
  61.  
  62.    return 0;
  63. }
  64.  

Y los resultados:
Código:
Metodo 1: 19 segundos.
Metodo 2: 10 segundos.

Process returned 0 (0x0)   execution time : 29.150 s
Press any key to continue.

Compilado con gcc y ejecutado en un Dual-Core T4300 a 2.1 Ghz

Ejecutandolo varias veces el metodo de User ronda los 18 - 19 segundos y el mio esta entre los 10 y los 11 (en la maquina que he dejado indicada)

¡Saludos!


Título: Re: Ayuda con cadenas.
Publicado por: User en 17 Julio 2012, 03:49 am
Bueno creo que esto esta yendo mas alla de mis nulos conocimientos en C :

Ahora se me vienen mas preguntas a la cabeza BlackZeroX dice que el codigo que use es mas optimo y me gustaria saber el porque ? tambien veo que no usa while en el ejemplo que puso y creo que el while es innecesario porque no requiero  recorrer toda la frase buscando los espacios en blanco, solo el primero, entonces con el if que usaste es suficiente verdad y pregunto nuevamente tambien porque el else ? .. el else en caso no encuentre espacios en blanco, pero donde lo usare siempre habra espacios en blanco, entonces el else no estaria de mas  ? corriganme si ando mal.

En cuando ejecucion de codigo, un codigo que haga determinada accion en menos tiempo que otro es mas efectivo ? siempre es asi ? velocidad = efectividad y estabilidad ?


No pense que este tema  llegaria a este punto y me pacere interesante ya que creo que esos puntos tambien son importantes. Gracias





Título: Re: Ayuda con cadenas.
Publicado por: do-while en 17 Julio 2012, 04:38 am
¡Buenas!

La cuestion es que si un codigo se ejecuta en menos tiempo que otro, significa que el coste (en tiempo) de las operaciones que realiza es menor. Por otra parte hay algo que me extraña y es que luego he hecho la prueba con el codigo de BlackZeroX:
Código
  1. for(i = 0 ; i < ITER ; i++)
  2. {
  3.    strcpy(CADENA, str2);
  4.  
  5.    ptr1 = strtok((char*)CADENA, ESPACIO);
  6.    if (ptr1)
  7.        ptr2 = strtok(NULL, END);
  8. }
  9.  

y me sigue saliendo que le cuesta tanto como al tuyo, por lo que resulta que es mas rapido valor2 = &str[strlen(str) + 1];  que ptr2 = strtok(NULL, END);. Y esto es lo que me resulta extraño, ya que con su codigo solamente se hace una llamada a funcion y una asignacion, por lo que la cuestion tiene que ser que strtok es mas lento que realizar todas las operaciones de &str[strlen(str) + 1]... :o

Que me lo expliquen... Si alguien de ingenieria inversa le puede hechar un vistazo a los binarios y aclararnoslo...

¡Saludos!

Acabo de dejar el codigo en el que he incluido el metodo de BlackZeroX por si quereis comprobar los tiempos.

¡Saludos!

Corrigiendo: Acabo de comprobar que si en una primera llamada no encuentra los delimitadores, devuelve la cadena completa, y si en alguna de las siguientes llamadas no encuentra delimitadores, tambien devuelve el resto de la cadena. Al parecer los unicos casos en los que strtok devuelve NULL es si se vuelve a llamar a la funcion cuando no se han encontrado delimitadores o si en algun momento solo quedan delimitadores en la cadena.

Pero si, el else estaba de mas, ya que si falla if(ptr1), es porque ptr1 ya es NULL, por lo que asignaerle NULL en el else es redundante.


Título: Re: Ayuda con cadenas.
Publicado por: BlackZeroX en 17 Julio 2012, 05:15 am
Quiero creer que strtok() hace una llamada a realloc() aumentando en +1 su tamaño ya que de lo contrario ese '\0' que agrega para dividir con varias llamadas a strtok() a larga crearía un error de escritura en regiones invalidas...

Código
  1.  
  2. ... solo es otra manera de escribir: &str[strlen(ptr1) + 1];
  3.  
  4.    ptr1 = strtok((char*)CADENA, ESPACIO);
  5.    ptr2 = ptr1 ? (char*)(cadena + strlen(ptr1) + 1): NULL;
  6.  
  7. ...
  8.  
  9.  

Dulces Lunas!¡.


Título: Re: Ayuda con cadenas.
Publicado por: do-while en 17 Julio 2012, 13:30 pm
Código
  1.    ptr2 = ptr1 ? (char*)(cadena + strlen(ptr1) + 1):
  2.  

Esto tampoco es correcto. A parte de que User ha dicho que todavia no ha estudiado la aritmetica de punteros, desplazar cadena stlen(ptr1) posiciones no te asegura pasar a la siguiente posicion despues del primer token (¿lees los post anteriores o solo les echas un vistazo por encima y luego posteas sin saber lo que se ha dicho anteriormente?)

Si cadena = "---hu-ha"; la primera llamada a strtok dejara las variables asi:

ptr1 = strtok(cadena,"-");

ptr1 = "hu";
cadena = "---hu'\0'ha"

Asi que cadena + strlen(ptr1) + 1 apuntara otra vez a "hu'\0'ha". En algun post anterior, ya he comentado que tiene que volver a utilizarse la misma cadena que se le ha pasado a strtok. Si miras como ha quedado cadena despues de la primera llamada a strtok veras el porque.

¡Saludos!


Título: Re: Ayuda con cadenas.
Publicado por: BlackZeroX en 17 Julio 2012, 18:00 pm
Esto tampoco es correcto. A parte de que User ha dicho que todavia no ha estudiado la aritmetica de punteros, desplazar cadena stlen(ptr1) posiciones no te asegura pasar a la siguiente posicion despues del primer token (¿lees los post anteriores o solo les echas un vistazo por encima y luego posteas sin saber lo que se ha dicho anteriormente?)


Si cadena = "---hu-ha"; la primera llamada a strtok dejara las variables asi:

ptr1 = strtok(cadena,"-");

ptr1 = "hu";
cadena = "---hu'\0'ha"

Asi que cadena + strlen(ptr1) + 1 apuntara otra vez a "hu'\0'ha"
. En algun post anterior, ya he comentado que tiene que volver a utilizarse la misma cadena que se le ha pasado a strtok. Si miras como ha quedado cadena despues de la primera llamada a strtok veras el porque.

¡Saludos!

Esa afirmación es mentira... la aritmética dice todo lo contrario, ya que ambos métodos son equitativos.

Código
  1.  
  2. ...
  3. char cadena[] = "Necesito repasar matematicas basicas"
  4. ptr1 = strtok(cadena, " "); // ptr1 = Necesito\0repasar matematicas basicas
  5. cadena + strlen(ptr1) + 1; // repasar matematicas basicas
  6. cadena[strlen(ptr1) + 1]; // repasar matematicas basicas
  7. ...
  8.  
  9.  

http://foro.elhacker.net/programacion_cc/ayuda_con_cadenas-t367020.0.html;msg1766536#msg1766536

Edito:

Nunca mire tu post (http://foro.elhacker.net/programacion_cc/ayuda_con_cadenas-t367020.0.html;msg1766412#msg1766412) me centre en la duda.

Dulces Lunas!¡.


Título: Re: Ayuda con cadenas.
Publicado por: do-while en 17 Julio 2012, 18:18 pm
Si vas a criticar algo, lee lo que se postea primero y luego comentas, ¿ok?

Bien, estaba nervioso porque no entrabas en razon y he utilizado palabras que no deberia. Lo siento. Con este codigo puedes comprobar que no estas en lo cierto:

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int main(int argc, char *argv[])
  5. {
  6.    char cadena[] = "    Necesito repasar matematicas basicas";
  7.    char *token,*resto,lector;
  8.  
  9.    token = strtok(cadena," ");
  10.  
  11.    printf("token: %s\ncadena + strlen(token) + 1: %s\ncadena + strlen(cadena) + 1: %s\n",
  12.            token, cadena + strlen(token) + 1, cadena + strlen(cadena) + 1);
  13.  
  14.    while((lector = getchar()) != '\n' && lector != EOF);
  15.  
  16.    return 0;
  17. }
  18.  

Por lo menos tomate la molestia de comprobar si lo que dices es cierto o no.

¡Saludos!

PD: Esto si que es un error que he cometido yo. No he comprobado si realmente queda cadena o no despues de la primera llamada a strtok. Vosotros al utilizar strtok de nuevo, podeis saberlo mirando si el puntero devuelto es NULL o no. Aqui va el nuevo codigo y los resultados de los tiempos.

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <time.h>
  4.  
  5. #define ITER 134217728
  6.  
  7. int main ()
  8. {
  9.  char str[] ="Hola como estas ?";
  10.  char str2[] = "Hola como estas ?";
  11.  char * pch;
  12.  char * valor1;
  13.  char * valor2;
  14.  int i,inicio,longitud;
  15.  
  16.    inicio = time(NULL);
  17.  
  18.    for(i = 0 ; i < ITER ; i++)
  19.    {
  20.        strcpy(str,str2);
  21.  
  22.        pch = strtok (str," "); // Empiezo a buscar la 1 coincidencia del espacio en blanco
  23.        while (pch != NULL)
  24.        {
  25.            valor1 = (pch); // Aqui se almacena la 1 palabra de la frase separa por el espacio en blanco
  26.            pch = strtok (NULL, ""); // Aqui ya no le pongo el espacio en blanco porque deseo el resto de la frase completa
  27.            valor2 = (pch); // Almaceno el resto de la frase en la variable
  28.            break; // Interrumpo el bucle pues como dije solo queria obtener la 1 palabra con el espacio como delimitador
  29.        }
  30.    }
  31.  
  32.    printf("Metodo 1: %d segundos.\n",time(NULL) - inicio);
  33.  
  34.    inicio = time(NULL);
  35.  
  36.    for(i = 0 ; i < ITER ; i++)
  37.    {
  38.        strcpy(str,str2);
  39.  
  40.        longitud = strlen(str);
  41.  
  42.        pch = strtok(str," ");
  43.  
  44.        if(pch)
  45.            if(strlen(str) != longitud)
  46.                valor2 = &str[strlen(str) + 1];
  47.    }
  48.  
  49.    printf("Metodo 2: %d segundos.\n",time(NULL) - inicio);
  50.  
  51.    inicio = time(NULL);
  52.  
  53.    for(i = 0 ; i < ITER ; i++)
  54.    {
  55.        strcpy(str,str2);
  56.  
  57.        pch = strtok(str," ");
  58.  
  59.        if (pch)
  60.            valor2 = strtok(NULL, "");
  61.    }
  62.  
  63.    printf("Metodo 3: %d segundos.\n",time(NULL) - inicio);
  64.  
  65.    return 0;
  66. }
  67.  

El tiempo del segundo metodo a subido algo...

Código:
Metodo 1: 19 segundos.
Metodo 2: 13 segundos.
Metodo 3: 19 segundos.

Process returned 0 (0x0)   execution time : 51.184 s
Press any key to continue.


Título: Re: Ayuda con cadenas.
Publicado por: User en 17 Julio 2012, 18:51 pm
Hola nuevamente  gracias a ambos por sus aclaraciones, ya quisiera tener sus conocimientos
que se nota que saben mucho pues ya hay cosas que no entiendo como dije soy novato en esto pues los unicos lenguajes que domino es vb 6.0 y php, y bueno ya se nota un poco de tension en los posts, muchachos ambos son buenos no entren en esa onda, ambos son buenos, no era mi intencion llegar a esto, gracias nuevamente a ambos y ya les podre otra duda no se si en otro hilo o lo continuo aqui.


Título: Re: Ayuda con cadenas.
Publicado por: BlackZeroX en 17 Julio 2012, 19:01 pm
Si vas a criticar algo, lee lo que se postea primero y luego comentas, ¿ok?

:) estaba pensando en [base cadena] + [longitud word] + [longitud divisor], jamas tome en consideración los divisores iniciales ( paso de textos que empiezan a ser pedantes ).

* Tomando los criterios de especializar la función para dicha cadena http://codepad.org/oCHGCGbd aun asi yo me quedo con strtok() (código de ejemplo: http://codepad.org/s9gKfS0Z);

Por lo menos tomate la molestia de comprobar si lo que dices es cierto o no.

Gracias por la ilustración maestro (vale madre estoy en vacaciones, jajaja).

P.D.: Como dicen por aquí "estas generando demasiada bilis".

Dulces Lunas!¡.


Título: Re: Ayuda con cadenas.
Publicado por: User en 17 Julio 2012, 21:44 pm
Hola nuevamente haber si me orientan, deseo encontrar una fucion en C similar a REPLACE
de VB 6

Ejemplo : strNewDate = Replace("08/31/2001", "/", "-")

Estuve averiguando en funciones en C y entontre que para hacer eso debo usar 2 funciones

strstr <---- Para ubicar la palabra a remplazar.
strncpy <--- Para especificar la palabra y nro de caracteres a remplazar.

Quedando el code asi :




Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int main ()
  5. {
  6.  char str[] ="Espero les vaya muy bien";
  7.  char * pch;
  8.  pch = strstr (str,"vaya");
  9.  strncpy (pch,"haga",4);
  10.  printf ("%s\n", str);
  11.  return 0;
  12. }

Quedando "Espero les haga muy bien"


Habra una manera mas practica como REPLACE en VB ? ... gracias por su apoyo.