Programación General > C/C++

 Buscar string en un archivo, y obtener datos

<< < (2/4) > >>

m0skit0:
strcpy te sirve perfectamente, aunque yo siempre uso strncpy para evitar infernales bugs de desbordamientos de buffer (que además pueden comprometer la seguridad de tu programa).


--- Código: C ---unsigned int pos; // Suponemos que aquí tienes guardada la posición en que se encuentra la subcadenachar* buscar; // Aquí la subcadena que buscaschar* cadena; // Aquí la cadena completachar* resto; // Aquí es donde quieres almacenar el resto de la cadena// Recuerda reservar la memoria y liberarla para todos estos punteros ;)[...]char* aux = (char*) ((unsigned int)cadena + pos + strlen(buscar));strncpy(resto, aux, <tamaño de "resto">); Ojo que tienes que reservar suficiente memoria para que en resto pueda caber todo lo que venga después de la subcadena.

emma1990:
Al final lo fui haciendo sin strcpy(). Qué te parece esto? A lo mejor es un poco chapuzas pero para lo que quiero es funcional   :P


--- Código: C ---FILE *pf;char cadena[100], linea[100], *ptr;pf = fopen("file.txt", "r");while (fgets(linea,100,pf) != NULL) {       fscanf(pf, "%s", &cadena);        ptr=strstr(linea, "Ki");if (ptr!=0) 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]); }fclose(pf);getchar();} 

m0skit0:
Un poco no, es MUY chapuzas. ¿Y qué pasa si la línea tiene más de 5 caracteres después del marcador? ¿Y por qué empiezas en +6?

De todas formas, si lo que quieres es mostrar el resto de la cadena, te vale con


--- Código: C ---if (ptr != NULL) {    printf("%sn", (char*)((unsigned int)ptr + strlen("Ki")));} - No pongas las condiciones del if seguidas, es poco legible, y usa siempre { }, te ahorrarás futuros quebraderos de cabeza.
- Usa NULL, no 0 (tampoco hagas !ptr)
- No uses literales en el código, usa constantes (#define)

Además ese código es muy poco flexible. Intenta programar de manera que si te toca modificar el código (y créeme que lo vas a tener que modificar) no tengas que mover cielo y tierra.

Amilius:
De acuerdo con todo, especialmente con adoptar un estilo definido de programación.

Aunque personalmente prefiero este tipo de comparaciones para verificar punteros no nulos:

--- Código: C++ --- if (ptr){}  
Y para los nulos prefiero usar el 0, ¿Para que escribir 4 letras y ocultar lo que en realidad es un puntero nulo?

--- Código: C++ --- if (0 == ptr){}   
Tampoco me hago problema con un if en una sóla linea siempre y cuando sea más rápido de leer. En casos extremadamente simples es más rápido leer esto:

--- Código: C++ --- if (0 == ptr) return;  
que esto:

--- Código: C++ --- if (0 == ptr) {    return;}  

haddad:
mmm creo  que quede un poco confundida en cuanto al orden de soluciones que planteaste
 
--- Cita de: "m0skit0" --- printf("%sn", (char*)((unsigned int)ptr + strlen("Ki")));
--- Fin de la cita ---
eso es la solucion a?

--- Cita de: "m0skit0" ---- No pongas las condiciones del if seguidas, es poco legible, y usa siempre { }, te ahorrarás futuros quebraderos de cabeza.
- Usa NULL, no 0 (tampoco hagas !ptr)
- No uses literales en el código, usa constantes (#define)
--- Fin de la cita ---

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

[*] Página Anterior

Ir a la versión completa