Programación General > C/C++

 Buscar string en un archivo, y obtener datos

<< < (3/4) > >>

m0skit0:

--- Cita de: "Amilius" ---Y para los nulos prefiero usar el 0, ¿Para que escribir 4 letras y ocultar lo que en realidad es un puntero nulo?
--- Fin de la cita ---
Porque es menos portable. Estás asumiendo que el puntero nulo tiene el valor 0, algo que en otras arquitecturas distintas de Intel no tiene por qué ser así. Por algo existe la constante NULL, que es dependiente de la arquitectura.


--- Cita de: "Amilius" ---Tampoco me hago problema con un if en una sóla linea siempre y cuando sea más rápido de leer.
--- Fin de la cita ---
A mí me parece menos legible por el simple hecho de tener distintas estructuras de ifs en todo el programa. Prefiero poner todos los ifs iguales, no veo porqué hay que poner unos ifs de una forma y otros de otra, no ayuda a la legibilidad en mi opinión. Pero vamos, es cuestión de formas y gustos.


--- Cita de: "haddad" ---printf("%sn", (char*)((unsigned int)ptr + strlen("Ki")));
eso es la solucion a?
--- Fin de la cita ---
Es parecido a


--- Código: C ---printf("%c%c%c%c%cn", cadena[ptr-cadena+6], cadena[ptr-cadena+7], cadena[ptr-cadena+8], cadena[ptr-cadena+9], cadena[ptr-cadena+10]); pero bien hecho  :P  ^_^

Leber:
Hola moskito, compilando esto:


--- Código: C --- #include <stdio.h>#include <string.h>#include <stdlib.h> int main(void){    char line[] = "Hola que tal estas";    char *ptr;             ptr = strstr (line, "que");            if(ptr != NULL) {                printf("%sn", (char*) ((unsigned int)ptr + strlen("que")) );            }            return 0;} 
Me da un warning, y si lo ejecuto da segfault. Si entiendo bien, le estas diciendo "lo que contiene ptr" + "la longitud de que". Y por que se hace un cast a unsigned int? Siento tantas preguntas pero es que estaba leyendo esto ayer, y me pico la curiosidad.

Gracias de antemano

m0skit0:
Perdona, lo había puesto sin probar.

Weno, acabo de ejecutar ese mismo programa y me funciona correctamente:


--- Código: Text ---root@bt:~# cat prueba.c#include <stdio.h>#include <string.h>#include <stdlib.h> int main(void){    char line[] = "Hola que tal estas";    char *ptr;             ptr = strstr (line, "que");            if(ptr != NULL) {                printf("%sn", (char*) ((unsigned int)ptr + strlen("que")) );            }            return 0;}root@bt:~# gcc -o prueba prueba.croot@bt:~# ./prueba tal estasroot@bt:~# 

Leber:
Pues, acabo de copiar tu codigo, y no funciona. Mira:


--- Código: C ---test@sistemes-oscar:~/c$ cat prueba.c #include <stdio.h>#include <string.h>#include <stdlib.h> int main(void){    char line[] = "Hola que tal estas";    char *ptr;             ptr = strstr (line, "que");            if(ptr != NULL) {                printf("%sn", (char*) ((unsigned int)ptr + strlen("que")) );            }            return 0;}test@sistemes-oscar:~/c$ gcc -o prueba prueba.cprueba.c: In function ‘main’:prueba.c:12: warning: cast from pointer to integer of different sizetest@sistemes-oscar:~/c$ ./prueba Segmentation faulttest@sistemes-oscar:~/c$ 
Me resulta bastante extraño.
Lo mismo, si lo hago en SO de 32 bits, funciona:


--- Código: C ---test@sistemes-test:~$ cat proba.c #include <stdio.h>#include <string.h>#include <stdlib.h>                                                                                                                                                                                                                                                                                                                                                         int main(void)                                                                                                                                                                        {                                                                                                                                                                                         char line[] = "Hola que tal estas";                                                                                                                                                   char *ptr;                                                                                                                                                                                                                                                                                                                                                                          ptr = strstr (line, "que");                                                                                                                                                           if(ptr != NULL) {                printf("%sn", (char*) ((unsigned int)ptr + strlen("que")) );            }            return 0;} test@sistemes-test:~$ ./proba  tal estastest@sistemes-test:~$  
En mi maquina, mi SO es de 64 bits, y no funciona, en esta ultima es de 32 bits y funciona. Ambas maquinas tienen la misma version del gcc 4.4.3.
No se ver muy claro por que en 32 si y en 64 no, lo unico que me viene a la cabeza es que los punteros en 64 bits ocupan 8 bytes en lugar de 4 como ocurre en 32, pero... esto no debería afectar en este codigo, no?

Gracias

m0skit0:
Bueno, esto lo malo que tiene C, que es poco portable si te pones a hacer malabares con punteros y casts.

El problema radica efectivamente como dices en el tamaño del puntero y en el uso de unsigned int, que si no recuerdo mal tiene el mismo tamaño en 32 que en 64 bits, de ahí el warning del compilador de que se están sumando dos tipos de tamaños diferentes (warning: cast from pointer to integer of different size) y por tanto pierdes posiblemente medio puntero, con lo que la dirección a la que apunta ya no tiene nada que ver, de ahí la violación de segmento.

Creo que si pones unsigned long long te debería funcionar sin problemas (no puedo probarlo porque no tengo máquina de 64 bits).

Saludos

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

[*] Página Anterior

Ir a la versión completa