Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Dividir 2 cadenas en 1

Estas en el tema de Dividir 2 cadenas en 1 en el foro de C/C++ en Foros del Web. Buenas, necesito dividir 1 cadena en 2 la cadena esta limitada por un espacio. Tengo echo esto: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código c: Ver original strcpy ( ...
  #1 (permalink)  
Antiguo 11/03/2013, 17:22
 
Fecha de Ingreso: noviembre-2012
Mensajes: 136
Antigüedad: 11 años, 6 meses
Puntos: 0
Dividir 2 cadenas en 1

Buenas, necesito dividir 1 cadena en 2 la cadena esta limitada por un espacio.

Tengo echo esto:


Código c:
Ver original
  1. strcpy(buf_aux,buffer); //Buffer es igual a "aa bb"
  2. marca=strtok(buffer," ");
  3. URL=strtok(buf_aux,marca);
  4.  
  5. printf("\nLa marca es: %s\n",marca);
  6. printf("\nLa URL es: %s\n",URL);
esto lo hace correctamente, el problema es que no tiene que ser bb sino una url, si pongo por ejemplo www.bb.es. Solo me coje www. a partir del punto no lo coje.

Alguna solución?
  #2 (permalink)  
Antiguo 11/03/2013, 18:08
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 1 mes
Puntos: 228
Respuesta: Dividir 2 cadenas en 1

Código C:
Ver original
  1. strcpy(buf_aux,buffer); //Buffer es igual a "aa bb"
  2. marca=strtok(buffer," ");
  3. URL=strtok(NULL," ");
  4.  
  5. printf("\nLa marca es: %s\n",marca);
  6. printf("\nLa URL es: %s\n",URL);

El segundo llamado a strtok tenes que hacerlo con NULL para que la funcion sepa que debe continuar donde quedo por ultima vez. Y el segundo argumento es siempre el separador, que puede ir cambiando en llamada tras llamada.

Saludos
  #3 (permalink)  
Antiguo 12/03/2013, 03:10
 
Fecha de Ingreso: noviembre-2012
Mensajes: 136
Antigüedad: 11 años, 6 meses
Puntos: 0
Respuesta: Dividir 2 cadenas en 1

Cita:
Iniciado por sam90 Ver Mensaje
Código C:
Ver original
  1. strcpy(buf_aux,buffer); //Buffer es igual a "aa bb"
  2. marca=strtok(buffer," ");
  3. URL=strtok(NULL," ");
  4.  
  5. printf("\nLa marca es: %s\n",marca);
  6. printf("\nLa URL es: %s\n",URL);

El segundo llamado a strtok tenes que hacerlo con NULL para que la funcion sepa que debe continuar donde quedo por ultima vez. Y el segundo argumento es siempre el separador, que puede ir cambiando en llamada tras llamada.

Saludos
gracias tio, pero me funciona a veces, es decir si pongo una URL corta funciona, pero si pongo algo del tipo http//www.aaa.com.org me salta una violacion del segmento.
Como puedo arreglaro, que lo tengo ya casi.

Saludos
  #4 (permalink)  
Antiguo 12/03/2013, 11:35
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 1 mes
Puntos: 228
Respuesta: Dividir 2 cadenas en 1

Pasanos el codigo completo. Es seguro que el error lo tienes en otro lado....
  #5 (permalink)  
Antiguo 12/03/2013, 16:01
 
Fecha de Ingreso: noviembre-2012
Mensajes: 136
Antigüedad: 11 años, 6 meses
Puntos: 0
Respuesta: Dividir 2 cadenas en 1

Cita:
Iniciado por sam90 Ver Mensaje
Pasanos el codigo completo. Es seguro que el error lo tienes en otro lado....
Aqui lo tienes:

La parte del Cliente te pongo todo el while a ver si es por otra cosa, pero la parte que estoy haciendo ahora es el case 3.
Código C:
Ver original
  1. while(opcio!=7){
  2.     printa_menu();
  3.     // Obtenim la opcio introduida per l'usuari
  4.     scanf("%d",&opcio);
  5.     printf("\n\n");
  6.     bzero(buffer, sizeof(buffer));            
  7.  
  8.     switch(opcio){
  9.                 fflush(stdout);
  10.                 // Opció HELLORQ OK!!
  11.         case 0: stshort(1,buffer); //Posem el codi de operacio al buffer
  12.                 sendto(sockClient, buffer, tamany_tshort, 0, (struct sockaddr*)&server, sizeof(struct sockaddr_in));
  13.                 bytes_rebuts= recvfrom(sockClient, buffer, sizeof(buffer), 0, (struct sockaddr*)&client, &client_t);
  14.                 printf("%d\n",bytes_rebuts );
  15.                 printf("%s\n", buffer+tamany_tshort); //Printem per patalla ell hello world
  16.                 bzero(buffer, sizeof(buffer));
  17.                 break;
  18.  
  19.                 //Opcio LlistRQ mostrem la llista dels bookmarks OK!!
  20.         case 1: stshort(3,buffer); //Posem el codi de operacio al buffer
  21.                 sendto(sockClient, buffer, tamany_tshort, 0, (struct sockaddr*)&server, sizeof(struct sockaddr_in));
  22.                 bzero(buffer, sizeof(buffer));
  23.                 bytes_rebuts= recvfrom(sockClient, buffer, sizeof(buffer), 0, (struct sockaddr*)&client, &client_t);
  24.                 printMarkTableFromAnArrayOfBytes(buffer+tamany_tshort, bytes_rebuts); //Funcio per printar els bookmarks, fem +tamany_buffer per eliminar el codi de operacio
  25.                 bzero(buffer, sizeof(buffer));
  26.                 break;
  27.  
  28.                 //Introduim una marca per teclat i ens retorna la URL asociada OKK
  29.         case 2: stshort(6, buffer);
  30.                 printf("\nIntrodueix la marca que vols consultar: \n");
  31.                 scanf("%s",&marca_consulta);
  32.                 tamany_buffer=strlen(marca_consulta);
  33.                 strcpy(buffer+tamany_tshort,marca_consulta);
  34.                 tamany_buffer=tamany_buffer+tamany_tshort;
  35.                 sendto(sockClient, buffer, tamany_buffer, 0, (struct sockaddr*)&server, sizeof(struct sockaddr_in));
  36.                 bytes_rebuts= recvfrom(sockClient, buffer, sizeof(buffer), 0, (struct sockaddr*)&client, &client_t);
  37.      
  38.                 if(ldshort(buffer)!=12)
  39.                 {
  40.                     printf("\nLa URL de la marca consultada es: %s",buffer+tamany_tshort);
  41.                    
  42.                 }
  43.                 else
  44.                 {
  45.                    
  46.                     printf("\n %s",buffer+tamany_tshort);  
  47.                 }
  48.                 bzero(buffer, sizeof(buffer));
  49.                 break;
  50.  
  51.         case 3: //Afegir una nova entrada a la taula
  52.                 stshort(5, buffer);
  53.                 printf("\nIntrodueix la nova marca que vols afegir: \n");
  54.                 scanf("%s",&afegir_marca); 
  55.                 strcpy(afegir_marca+strlen(afegir_marca)," ");
  56.                 t_afegir_marca=strlen(afegir_marca);
  57.            
  58.                 printf("\nIntrodueix la URL de la marca que vols afegir: \n");
  59.                 scanf("%s",&afegir_URL);
  60.                
  61.                 t_afegir_URL=strlen(afegir_URL);
  62.                 tamany_buffer=tamany_tshort+t_afegir_URL+t_afegir_marca;
  63.                 strcat(afegir_marca,afegir_URL);
  64.                 strcpy(buffer+2,afegir_marca);
  65.                 sendto(sockClient, buffer, tamany_buffer, 0, (struct sockaddr*)&server, sizeof(struct sockaddr_in));
  66.                 printf("%s\n",buffer+tamany_tshort );
  67.                 break;
  68.  
  69.                 }
  70.  
  71.   } //end while(opcio)

Esta es la parte del servidor donde llamo a la funcion para separar las cadenas, te pongo todo el while pero es el case 5:
Código C:
Ver original
  1. //La funcion para separar las cadenas
  2. void afegirMarca(char *buffer, struct _markTable* taula_de_Marques)
  3. {
  4.  
  5. char *URL;
  6. char *marca;
  7. char *buf_aux;
  8.  
  9. int longitud=strlen(buffer);
  10. printf("La longitud del buffer es: %d", longitud);
  11.  
  12. printf("%s", buffer);
  13. strcpy(buf_aux,buffer);
  14.  
  15. marca=strtok(buffer," ");
  16. URL=strtok(NULL," ");
  17.  
  18. printf("\nLa marca es: %s\n",marca);
  19.  
  20. printf("\nLa URL es: %s\n",URL);
  21.    
  22. }
  23.  
  24.  while(1)
  25.   {      
  26.           //bzero (buffer, sizeof(buffer));
  27.          
  28.           bytes_rebuts = recvfrom(sockServer, buffer,sizeof(buffer),0, (struct sockaddr*)&server, &server_t);
  29.          
  30.           if (bytes_rebuts== -1)
  31.           {
  32.              printf("Error al rebre dades, bytes rebuts= %d\n\n", bytes_rebuts);
  33.           }
  34.  
  35.          
  36.         switch(ldshort(buffer))
  37.         {
  38.          //Enviem el hello world OK!!!!!!!!!!
  39.           case 1:     bzero(buffer, sizeof(buffer));
  40.                       stshort(2,buffer);
  41.                       strcpy(buffer+t_short,"HELLO WORLD");
  42.                       tamany_buffer=t_short+strlen(buffer+1);
  43.                       sendto(sockServer, buffer, tamany_buffer, 0, (struct sockaddr*)&server, sizeof(struct sockaddr_in));
  44.                       bzero (buffer, sizeof(buffer));
  45.                       break;
  46.  
  47.                       //Enviem la taula de marques OK!!!!!!
  48.           case 3:       bzero(buffer, sizeof(buffer)); //Buidem el buffer
  49.                       stshort(4,buffer); //Posem el codi de operacio al buffer
  50.                       memcpy(buffer+t_short,markTable_to_byteArray,tamany_markTable); //Copiem al buffer, la taula de marques indicant el seu tamany
  51.                       sendto(sockServer, buffer, tamany_markTable, 0, (struct sockaddr*)&server, sizeof(struct sockaddr_in));
  52.                       bzero (buffer, sizeof(buffer));
  53.                       break;
  54.  
  55.                       //Afegir una nova entrada a la taula
  56.           case 5:    
  57.                       printf("Antes de la funcion= %s\n", buffer+2)
  58.                       afegirMarca(buffer+2,markTable);
  59.                    
  60.                      // printf("Despues de la funcion= %s", buffer+2);
  61.  
  62.                       bzero(buffer, sizeof(buffer));
  63.                       break;
  64.  
  65.                       //Consulta d'una marca OK!!!
  66.           case 6:   URL_consultada = consultarMarca(buffer+2,markTable);//Cridem a la funcio per buscar la URL asosciada a la marca
  67.                       if(!strcmp(URL_consultada,"Error marca no trobada"))//En cas de no trobar la marca posearem un codi o un altre
  68.                       {
  69.                         stshort(12,buffer);
  70.                      
  71.                       }
  72.                       else
  73.                       {
  74.                         stshort(7,buffer);
  75.                      
  76.                       }
  77.  
  78.                     tamany_buffer=t_short+strlen(URL_consultada); //Mesurem el nou tamany de buffer
  79.                     strcpy(buffer+t_short,URL_consultada);
  80.                     sendto(sockServer, buffer, tamany_buffer, 0, (struct sockaddr*)&server, sizeof(struct sockaddr_in)); //Enviem la URL mes el codi d'operacio
  81.                     bzero (buffer, sizeof(buffer));
  82.                     break;
  83.  
  84.         }

Haber si entre los 2 encontramos una solucion, gracias
  #6 (permalink)  
Antiguo 12/03/2013, 18:16
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 1 mes
Puntos: 228
Respuesta: Dividir 2 cadenas en 1

El printf de buffer en la funcion afegirMarca muestra bien el contenido o ya eso falla?

Ponelo asi:

printf("ANTES\n");
printf("%s\n", buffer);
printf("DESPUES\n");

Es solo para descartar posibilidades.
  #7 (permalink)  
Antiguo 13/03/2013, 02:16
 
Fecha de Ingreso: noviembre-2012
Mensajes: 136
Antigüedad: 11 años, 6 meses
Puntos: 0
Respuesta: Dividir 2 cadenas en 1

Si si ese funciona muestra lo correcto, lo que si que es verdad que me pasa a veces con los prints que a veces me printa las cosas a la 2a llamada pero bueno este no es el caso.

En este codigo que te he pasado en el print de la URL i la Marca me muestra la url y la marca correctamente, pero repito si la la url es muy larga me sale un "segmentation fault". I si hago la llamada varias veces tambe rebienta. Es como si depues de varias llamadas el puntero se quedara apuntado a "Cuenca".

El formato del mensajo que envio desde el cliente es por ejemplo "aaaa //http.www.aa.es", es epacio no es /0 si te fijas en el cliente cuando copio las cadenas añado al final de la marca un
Código C:
Ver original
  1. strcpy(afegir_marca+strlen(afegir_marca)," ");

Saludos
  #8 (permalink)  
Antiguo 13/03/2013, 11:36
 
Fecha de Ingreso: noviembre-2012
Mensajes: 136
Antigüedad: 11 años, 6 meses
Puntos: 0
Respuesta: Dividir 2 cadenas en 1

Lo he solucionado de otra forma gracias

Etiquetas: cadenas, dividir
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:30.