Programación General > C/C++
Buscar string en un archivo, y obtener datos
Leber:
Efectivamente, 4 bytes se pierden con solo unsigned int. Aunque basta con ponert unsigned long int:
--- Código: C ---int main(void){ char line[] = "Hola que tal estas"; char *ptr; printf("Size int-> %ldn", sizeof(unsigned int)); printf("Size int-> %ldn", sizeof(unsigned long int)); ptr = strstr (line, "que"); if(ptr != NULL) { printf("%sn", (char*) ((unsigned long int)ptr + strlen("que")) ); } return 0;} test@test:~/c$ ./prueba Size int-> 4Size int-> 8 tal estas
Igualmente, tengo otra duda, y es sobre:
--- Código: C ---(char*) ((unsigned long int)ptr + strlen("que"))
Sobretodo esta parte:
--- Código: C ---(unsigned long int)ptr . Estas casteando la direccion de memoria, y le sumas 3, que es la longitud de la cadena.
Entonces, si la direccion de ptr empieza en "0x7fffd1573a20" le sumas 3 quedando: "0x7fffd1573a23"
Es correcto, o me estoy liando?
Saludos, y gracias por las respuestas =)
m0skit0:
--- Cita de: "Leber" --- Aunque basta con ponert unsigned long int
--- Fin de la cita ---
Ah, ok. En 32 bits y según mi experiencia sizeof(long) = sizeof(int)
--- Código: C ---#include <stdio.h> int main(void){ printf("%d %dn", sizeof(int), sizeof(long)); return 0;} de ahí que dijera long long ^_^
--- Cita de: "Leber" ---Estas casteando la direccion de memoria, y le sumas 3, que es la longitud de la cadena.
Entonces, si la direccion de ptr empieza en "0x7fffd1573a20" le sumas 3 quedando: "0x7fffd1573a23"
Es correcto, o me estoy liando?
--- Fin de la cita ---
Exacto. Hago el cast para que el compilador entienda que no me he equivocado, que efectivamente quiero que a un puntero le sume un entero, pero que luego lo siga considerando un puntero. Y le sumo la longitud de la cadena para posicionarme al final de la cadena que se ha encontrado con strstr().
Ojo y repito que esto sólo funciona si quiero el resto de la cadena (desde la posición X hasta final de cadena). De otro modo que no sea hasta el final de la cadena habría que hacer un memcpy/strncpy en un buffer y añadirle el terminador de cadena antes de poder mostrarlo con printf (o cualquier otra función de manejo de cadenas).
Leber:
Hola m0skito.
Si, entiendo que ese es el funcionamiento, que lo que quieres es:
Teniendo una cadena tal que asi: "hola que tal", y que strstr te devuelva un puntero a "que tal" (porque has buscado la primera aparicion de que), lo que le estas diciendo es:
Muestrame lo que sigue a partir de la posicion, p.e: 0x7fffd1573a23, (teniendo en cuenta que ptr apunte a 0x7fffd1573a20). Entonces recibes a partir de 0x7fffd1573a23 hasta final de linea.
Gracias por tu ayuda, me ha quedado bastante claro, y es algo que siempre he tenido algo así así, sabian lo que eran los punteros, pero no los habia manipulado de esta manera, no habia entendido nunca demasiado bien el desplazamiento que podias hacer a traves de la memoria, como ahora.
Saludos y gracias
m0skit0:
--- Cita de: "Leber" --- Entonces recibes a partir de 0x7fffd1573a23 hasta final de linea.
--- Fin de la cita ---
Bueno, para seguir hablando de posiciones de memoria, que muestre los caracteres desde 0x7fffd1573a23 hasta que encuentre un byte (o carácter) nulo.
No hay de qué, estamos aquí para compartir lo que sabemos, así que ya sabes, ahora te toca a ti compartir ;) :comp:
Leber:
--- Cita de: "m0skit0" ---No hay de qué, estamos aquí para compartir lo que sabemos, así que ya sabes, ahora te toca a ti compartir ;) :comp:
--- Fin de la cita ---
Intentaremos que así sea =)
Navegación
[*] Página Anterior
Ir a la versión completa