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

C

Estas en el tema de C en el foro de C/C++ en Foros del Web. Hola, Estoy programando en C y mi duda es la siguiente: Si tengo un char m[32] = "0000111100001111...", como puedo ir cogiendo de byte en ...
  #1 (permalink)  
Antiguo 16/04/2007, 03:29
 
Fecha de Ingreso: noviembre-2006
Mensajes: 46
Antigüedad: 17 años, 5 meses
Puntos: 0
C

Hola,

Estoy programando en C y mi duda es la siguiente:

Si tengo un char m[32] = "0000111100001111...", como puedo ir cogiendo de byte en byte? o elemento en elemento? Y si tuviera char *m[32] como accederia a los datos?

Gracias,
  #2 (permalink)  
Antiguo 16/04/2007, 03:38
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Re: C

m[0], m[1], etc.

char *m[32] seria un array de 32 punteros a char y accederias por ejemplo al segundo caracter de la segunda cadena asi: m[1][1].
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #3 (permalink)  
Antiguo 16/04/2007, 05:05
 
Fecha de Ingreso: noviembre-2006
Mensajes: 46
Antigüedad: 17 años, 5 meses
Puntos: 0
Re: C

Hola,

Entonces si quisiera unir los elementos m[0] y m[1] podría hacer:
char *x = m[0]+m[1]?


Y si quisiera tener un vector de string debería declararlo como:
char *vector[3]? o puedo hacer simplemente esto:

char vector[3] = {"01111111","00111100","00110011"};

Muchas gracias,

Lis
  #4 (permalink)  
Antiguo 16/04/2007, 05:15
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Re: C

Cita:
Iniciado por anac Ver Mensaje
Entonces si quisiera unir los elementos m[0] y m[1] podría hacer:
char *x = m[0]+m[1]?
No, para concatenar cadenas necesitas (primero tener el espacio necesario) usar la funcion strcat.

Cita:
Iniciado por anac Ver Mensaje
Y si quisiera tener un vector de string debería declararlo como:
char *vector[3]? o puedo hacer simplemente esto:

char vector[3] = {"01111111","00111100","00110011"};
No podes hacerlo por una razon, estas declarando un array de 3 caracteres, si hicieras lo mismo pero con char *vector[3] si funcionaria al ser un array de tres punteros a caracter a los cuales se les asignaria las direcciones en memoria (seccion de datos) de esas cadenas.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #5 (permalink)  
Antiguo 16/04/2007, 21:40
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 5 meses
Puntos: 52
Re: C

Te lo voy a explicar de una manera rapida y resumida.

char es, en las arquitecturas x86, un byte.

char var;

Esto tiene sólo espacio para UN byte.
Y un byte sólo puede contener un caracter ASCI.

Si tienes una array así:

char var[3];

quiere decir que tienes 3 bytes.

var[0]->byte número 1
var[1]->byte número 2
var[2]->byte número 3.

Entonces solo puedes contener 3 caracteres.

Pero.

Si haces eso:

char car[3]="abc";

hay un pequeño error. Las cadenas de texto siempre terminan con un valor null.
entonces en realidad tendrias algo asi:

"abc\0"

por lo que ya son 4 bytes.
(se supone es asi, no tengo la total seguridad)

Entonces ya tienes que hacer algo asi:

char var[4]="abc";

(Continua)
  #6 (permalink)  
Antiguo 16/04/2007, 21:43
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 5 meses
Puntos: 52
Re: C

Ahora.

char *var;

es un puntero.

Es muy parecido a los arrays, pero con muchas mas ventajas y mcuho mas peligrosos y traicioneros, claro, si es que no lo sabes usar.

char *var=lo que sea;
lo unico que hace es apuntar a ese "lo que sea".

char *var[];

Es un arreglo de punteros.
Como si tubieras muchos punteros ordenados en fila.

Si queires saber mas sobre los punteros en el link de mi firma hay bastante informacion.

Saludos
  #7 (permalink)  
Antiguo 17/04/2007, 00:09
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Re: C

Cita:
Iniciado por Instru Ver Mensaje
Y un byte sólo puede contener un caracter ASCI.
Un byte puede contener cualquier valor entre 0 y 255 (8 bits), mientas que el standard ASCII (no el extendido) solo contiene valores de 0 a 127 (7 bits).

http://en.wikipedia.org/wiki/Ascii
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #8 (permalink)  
Antiguo 17/04/2007, 06:22
 
Fecha de Ingreso: noviembre-2006
Mensajes: 46
Antigüedad: 17 años, 5 meses
Puntos: 0
Re: C

Hola,

Gracias por vuestra ayuda, he entendido como funcionan los char[] en C, pero a ver, tengo otra duda:

Si yo lo que tengo es un char m[255]="0001010101011101110100011....", como puedo coger byte por byte, porque lo de m[0],m[1] no funciona. He intentado hacer esto:

int x = strcat(m[0], m[1]);
pero no funciona.

Muchas gracias,
Un saludo,
Lis
  #9 (permalink)  
Antiguo 17/04/2007, 06:42
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Re: C

Cita:
Iniciado por anac Ver Mensaje
porque lo de m[0],m[1] no funciona. He intentado hacer esto:

int x = strcat(m[0], m[1]);
pero no funciona.
Lo que no funciona es el que codigo que pusiste que no tiene ninguna logica. m[0] y m[1] no son punteros a char sino chars asi que no se le pasan como parametros a strcat que pide dos punteros a char (destino y origen) y no devuelve un int como resultado sino un puntero a char (destino).

¿Que queres hacer exactamente? Si lo que queres es una segunda cadena primero necesitas, como ya te dije, el espacio para la misma.

Aca tenes algo de codigo a ver si te haces una idea:
Código:
char m[] = "0001010101011101110100011....";
printf("%s\r\n", m);
printf("%c\r\n", m[0]);
printf("%c\r\n", m[1]);
printf("%c\r\n", m[3]);
char nCadena[255];
memset(nCadena, 0, sizeof(nCadena));
strncpy(nCadena, m, 2);
printf("%s\r\n", nCadena);
strcat(nCadena, " MAS TEXTO");
printf("%s\r\n", nCadena);
Supongo que lo que querias hacer era algo asi:
Código:
char *vector[3] = {"01111111","00111100","00110011"};
char conc[1024];
memset(conc, 0, sizeof(conc));
strcpy(conc, vector[0]);
strcat(conc, vector[1]);
printf("%s\r\n", conc);

Siempre es mejor usar memoria dinamica.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #10 (permalink)  
Antiguo 17/04/2007, 07:26
 
Fecha de Ingreso: noviembre-2006
Mensajes: 46
Antigüedad: 17 años, 5 meses
Puntos: 0
Re: C

Hola,

Te agradezco mucho tu ayuda, me has hecho comprender mejor el funcionamiento de los char pero yo sigo sin saber como separar de 8 bits en 8 bits un char[]:

char a[48] = "111111100000001111111100000000111111110000000 0",

quiero obtener:

char b[8] = "11111111"
char c[8] = "00000000"
char d[8] = "11111111"
char e[8] = "00000000"
char f[8] = "11111111"
char g[8] = "00000000"



Muchas gracias,

Un saludo,

Ana
  #11 (permalink)  
Antiguo 17/04/2007, 08:17
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Re: C

Cita:
Iniciado por anac Ver Mensaje
Te agradezco mucho tu ayuda, me has hecho comprender mejor el funcionamiento de los char pero yo sigo sin saber como separar de 8 bits en 8 bits un char[]:
Lo que tenes que hacer es copiar 8 caracteres desde una direccion determinada a otra. Por ejemplo para obtener lo que seria tu c (segundo conjunto de 8 caracteres comenzando en a) lo que harias seria lo siguiente:

Código:
char c[9]; //necesitamos al menos la cantidad de caracteres mas uno que es el terminador (0)
memset(c, 0, sizeof(c)); //ponemos todos los caracteres a 0
strncpy(c, a + 8, 8); //copiamos 8 caracteres desde a + 8
Tenes que aplicar la misma logica para obtener todos los demas.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #12 (permalink)  
Antiguo 17/04/2007, 08:55
 
Fecha de Ingreso: noviembre-2006
Mensajes: 46
Antigüedad: 17 años, 5 meses
Puntos: 0
Re: C

Muchas gracias, la verdad es que llevaba dias con esto. Estoy acsotumbrada a programar en C++ y con C no me aclaro mucho.

Gracias de nuevo,

Un saludo!
  #13 (permalink)  
Antiguo 17/04/2007, 09:08
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Re: C

Cita:
Iniciado por anac Ver Mensaje
Muchas gracias, la verdad es que llevaba dias con esto. Estoy acsotumbrada a programar en C++ y con C no me aclaro mucho.

Gracias de nuevo,

Un saludo!
De nadas
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #14 (permalink)  
Antiguo 18/04/2007, 02:42
 
Fecha de Ingreso: noviembre-2006
Mensajes: 46
Antigüedad: 17 años, 5 meses
Puntos: 0
Re: C

Hola,

Una pregunta mas, y si quisiera is borrando lo que voy cogiendo del char[] que funcion tendria que usar?

Gracias,

Un saludo
  #15 (permalink)  
Antiguo 18/04/2007, 02:57
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Re: C

Cita:
Iniciado por anac Ver Mensaje
Una pregunta mas, y si quisiera is borrando lo que voy cogiendo del char[] que funcion tendria que usar?
¿Que queres hacer exactamente? Me refiero mas que nada al objetivo, esa memoria ya la tenes reservada estaticamente asi que no la podes liberar, lo maximo que podrias hacer es ponerla a cero y para eso podes usar la funcion memset.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #16 (permalink)  
Antiguo 18/04/2007, 03:10
 
Fecha de Ingreso: noviembre-2006
Mensajes: 46
Antigüedad: 17 años, 5 meses
Puntos: 0
Re: C

Hola,

Muchas gracias, probare esta funcion.
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 03:12.