Cadenas de caracteres , Puntero mas Dudas !!

Iniciado por bash, 24 Mayo 2015, 16:52 PM

0 Miembros y 1 Visitante están viendo este tema.

bash

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 (cpp) [Seleccionar]
#include <iostream>
#include <cstring>
#include <stdlib.h>
using namespace std;


struct Campos {
 char *campo1;//10 era un array de 10 campos y como quiera
 char campo2[16];
 char campo3[7];
 char campo4[8];
 char campo5[6];
 char campo6[21];


};

char datos[] ="SOLOESTO..0000000000000000000     0000000   000000000     0000.0  00000-00-10011:00:00 ";

int main(){
  Campos cmp1;
  memset(&cmp1, 0x00, sizeof(Campos));
 char *token = strtok(datos , " ");
 while(token != NULL)
 {
    cout << " "<<endl<< token;
    token = strtok(NULL, " ");

 }
 int iteraciones= 0;

  cout << "iteraciones ----------------------------------------";
 for( ; iteraciones < 11; iteraciones++)
 {

   if(iteraciones < 12)
   {
     strncat(cmp1.campo1,&token[iteraciones], 1);
     cout << cmp1.campo1;
   }



 }


}


Gracias !!
gracias por responder mis dudas

Stakewinner00

#1
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

OnTheCore

podes cambiar esto:
int iteraciones= 0;
for( ; iteraciones < 11; iteraciones++)

por
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.

bash

#3
ya arregle la condicion OntheCore !!


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

a parte le hize un cambio

al codigo
Código (cpp) [Seleccionar]


#include <iostream>
#include <cstring>
#include <cstdlib.h>
using namespace std;


struct Campos {
 char campo1[10];//10
 char campo2[16];
 char campo3[7];
 char campo4[8];
 char campo5[6];
 char campo6[21];


};

char datos[] ="SOLOESTO..0000000000000000000     0000000   000000000     0000.0  00000-00-10011:00:00 ";

int main(){
  Campos cmp1;
  memset(&cmp1, 0x00, sizeof(Campos));
  char token2[2000];
 char *token = strtok(datos , " ");
 while(token != NULL)
 {
    cout << " "<<endl<< token;
   
/////AQUI
    strcat(token2, token );
     token=strtok(NULL, " ");
     strcat(token2, token );
//// AQUI ....

 }

 cout <<token2;


cout<< " token : \n"<<token<<endl;
  cout << "\niteraciones ----------------------------------------";
 for(int iteraciones= 0;  iteraciones < 11; iteraciones++)
 {

   if(iteraciones < 11)
   {
     strncat(cmp1.campo1,token[iteraciones], 1);////en esta iteracion solo quiero copiar                   un caracter
     cout << cmp1.campo1;
   }



 }

}


Me asegure de darle 2000 campos para ver si no falla pero falla como quiera.
gracias por responder mis dudas

Stakewinner00

Piensa que pasa y porque pasa si haces algo como
char* c = NULL;
&c;

bash

#5
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 (cpp) [Seleccionar]
char datos[] ="SOLOESTO..0000000000000000000     0000000   000000000     0000.0  00000-00-10011:00:00 ";

int main(){
  char *b;
  b =(char*)malloc(1000);
  for(int i= 0; i < strlen(datos); i++)
    if( i < 10)
       strncat(b, &datos[i],1);

    cout<<b;
    free(b);


}



Modicado
Código (cpp) [Seleccionar]
while( (ptr = strtok( NULL, s2 )) != NULL )    // Posteriores llamadas
    strncat(s, ptr,20);

esto si funciona aunque aun me manda caracteres raros , por que  ?

Gracias !!
gracias por responder mis dudas