Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: bash en 24 Mayo 2015, 16:52 pm



Título: Cadenas de caracteres , Puntero mas Dudas !!
Publicado por: bash en 24 Mayo 2015, 16:52 pm
Buenas a todos !!
vuelvo con otras dudas sobre esto de las cadenas ahora tengo una duda que me surgio sobre esto  usar las funciones de string.h  

ahora le toca a strcat , ahora tengo una estructura de y quiero copiar varios campos que son punteros o son arreglos y el resultado es el mismo , el programa crash  voy a poner el codigo  :

Código
  1. #include <iostream>
  2. #include <cstring>
  3. #include <stdlib.h>
  4. using namespace std;
  5.  
  6.  
  7. struct Campos {
  8.  char *campo1;//10 era un array de 10 campos y como quiera
  9.  char campo2[16];
  10.  char campo3[7];
  11.  char campo4[8];
  12.  char campo5[6];
  13.  char campo6[21];
  14.  
  15.  
  16. };
  17.  
  18. char datos[] ="SOLOESTO..0000000000000000000     0000000   000000000     0000.0  00000-00-10011:00:00 ";
  19.  
  20. int main(){
  21.   Campos cmp1;
  22.   memset(&cmp1, 0x00, sizeof(Campos));
  23.  char *token = strtok(datos , " ");
  24.  while(token != NULL)
  25.  {
  26.     cout << " "<<endl<< token;
  27.     token = strtok(NULL, " ");
  28.  
  29.  }
  30.  int iteraciones= 0;
  31.  
  32.   cout << "iteraciones ----------------------------------------";
  33.  for( ; iteraciones < 11; iteraciones++)
  34.  {
  35.  
  36.    if(iteraciones < 12)
  37.    {
  38.      strncat(cmp1.campo1,&token[iteraciones], 1);
  39.      cout << cmp1.campo1;
  40.    }
  41.  
  42.  
  43.  
  44.  }
  45.  
  46.  
  47. }
  48.  

Gracias !!


Título: Re: Cadenas de caracteres , Puntero mas Dudas !!
Publicado por: Stakewinner00 en 24 Mayo 2015, 17:08 pm
si te fijas al intentar hacer &token[n], token es NULL y no puede acceder a esa memoria

si es C++ estas usando una lib de C stdlib.h que tendría que ser cstdlib y en el for tendrías que meter el int iteraciones = 0 dentro del for.

a parte que el if de dentro del for es inútil


Título: Re: Cadenas de caracteres , Puntero mas Dudas !!
Publicado por: OnTheCore en 24 Mayo 2015, 17:15 pm
podes cambiar esto:
Código:
int iteraciones= 0;
for( ; iteraciones < 11; iteraciones++)
por
Código:
for(int interaciones = 0; iteraciones , 11; iteraciones++)

el "if(iteraciones < 12)" esta de mas, es obvio que si el bucle for va de 0 a 11 siempre va a ser menor que 12.

Tenes que hacer todo en el bucle while, el segundo for esta de mas.
strtok retorna un puntero al inicio de los datos separados por cada iteracion, entonces vos lo que tenes que hacer es copiar ese dato directamente a la estructura.

No se si me explico. Mira este ejemplo: http://www.tutorialspoint.com/c_standard_library/c_function_strtok.htm

Ves como imprime cada dato separado con printf? bueno, vos en vez de imprimirlo tenes que copiarlo al campo de la estructura que quieras.


Título: Re: Cadenas de caracteres , Puntero mas Dudas !!
Publicado por: bash en 24 Mayo 2015, 17:26 pm
ya arregle la condicion OntheCore !!
 

Stakewinner00: le puse & por la declaracion dentro del header mira lo que dice
Código
  1. _CRTIMP char* __cdecl __MINGW_NOTHROW strncat (char*, const char*, size_t);

a parte le hize un cambio

al codigo
Código
  1.  
  2. #include <iostream>
  3. #include <cstring>
  4. #include <cstdlib.h>
  5. using namespace std;
  6.  
  7.  
  8. struct Campos {
  9.  char campo1[10];//10
  10.  char campo2[16];
  11.  char campo3[7];
  12.  char campo4[8];
  13.  char campo5[6];
  14.  char campo6[21];
  15.  
  16.  
  17. };
  18.  
  19. char datos[] ="SOLOESTO..0000000000000000000     0000000   000000000     0000.0  00000-00-10011:00:00 ";
  20.  
  21. int main(){
  22.   Campos cmp1;
  23.   memset(&cmp1, 0x00, sizeof(Campos));
  24.   char token2[2000];
  25.  char *token = strtok(datos , " ");
  26.  while(token != NULL)
  27.  {
  28.     cout << " "<<endl<< token;
  29.  
  30. /////AQUI
  31.     strcat(token2, token );
  32.      token=strtok(NULL, " ");
  33.      strcat(token2, token );
  34. //// AQUI ....
  35.  
  36.  }
  37.  
  38.  cout <<token2;
  39.  
  40.  
  41. cout<< " token : \n"<<token<<endl;
  42.   cout << "\niteraciones ----------------------------------------";
  43.  for(int iteraciones= 0;  iteraciones < 11; iteraciones++)
  44.  {
  45.  
  46.    if(iteraciones < 11)
  47.    {
  48.      strncat(cmp1.campo1,token[iteraciones], 1);////en esta iteracion solo quiero copiar                   un caracter
  49.      cout << cmp1.campo1;
  50.    }
  51.  
  52.  
  53.  
  54.  }
  55.  
  56. }
  57.  
  58.  
  59.  
Me asegure de darle 2000 campos para ver si no falla pero falla como quiera.


Título: Re: Cadenas de caracteres , Puntero mas Dudas !!
Publicado por: Stakewinner00 en 24 Mayo 2015, 17:31 pm
Piensa que pasa y porque pasa si haces algo como
char* c = NULL;
&c;


Título: Re: Cadenas de caracteres , Puntero mas Dudas !!
Publicado por: bash en 24 Mayo 2015, 17:58 pm
si te entiendo pero existe una forma de copiar el token en otra cadena

use strcpy , memcpy ... y el resultado fue el mismo . pienso que es por q al final strtok devuelve el ultimo token como nulo pero tambien el hize una comparacion y nada.
dime si me equivoco , tambien estoy tratando con algo como lo siguiente que si copa pero
al final salen caracteres que no  estan en la cadena , por que pasa eso ?
mira el codigo :


Código
  1. char datos[] ="SOLOESTO..0000000000000000000     0000000   000000000     0000.0  00000-00-10011:00:00 ";
  2.  
  3. int main(){
  4.   char *b;
  5.   b =(char*)malloc(1000);
  6.   for(int i= 0; i < strlen(datos); i++)
  7.     if( i < 10)
  8.        strncat(b, &datos[i],1);
  9.  
  10.     cout<<b;
  11.     free(b);
  12.  
  13.  
  14. }


Modicado
 
Código
  1. while( (ptr = strtok( NULL, s2 )) != NULL )    // Posteriores llamadas
  2.     strncat(s, ptr,20);
  3.  
esto si funciona aunque aun me manda caracteres raros , por que  ?

Gracias !!