Autor
|
Tema: Programa identifique partes de una linea (Leído 3,057 veces)
|
m@o_614
Desconectado
Mensajes: 389
|
Saludos tengo un programa que me tiene que leer un archivo como por ejemplo: ;comentario numero 1 =TALLER= Et1 equ $ffFF dos LDAA @4732 ;comentario numero 2 ¡Programacion! ;comentario numero 3 tres sWi x,5 Netq%23 RMB 556 Et12_xyz12 ADCA 1,PC y me tiene que imprimir sus partes COMENTARIO ETIQUETA = Et1 CODOP = equ OPERANDO = $ffFF ... ... y asi con todas las lineas el problema es que para las las etiquetas tengo dos reglas, una que su longitud no sea mayor a 8 caracteres y otra, que solo tenga letras, numeros y el guion bajo, si una etiqueta tiene otro caracter tengo que imprimir Error:los caracteres validos en las etiquetas son letras, digitos(0..9) y el guion bajo pero para el Netq%23 me tendria que imprimir un mensaje de error, por que tiene el %, pero no imprime nada no entiendo por que #include <stdio.h> #include <stdlib.h> #include <string.h> #define LONG_ETIQUETA 8 #define LONG_CODOPS 5 typedef enum {FALSO,VERDADERO} booleano; typedef enum {ETIQUETA,CODOP,OPERANDO} linea; booleano esComentario(FILE *fd); char *Etiqueta_Codop_Operando(FILE *fd,int linea); void erroresEtiqueta(char *etiqueta); void buscarFinLinea(FILE *fd); void ignorarEspacios(FILE *fd); booleano esNumero(char cadena[],int i); booleano esLetra(char cadena[],int i); int main() { FILE *fd; int car; char *etiqueta,*codop,*operando; if((fd = fopen("P1ASM.txt","r"))!= NULL ) { while((car = fgetc(fd ))!= EOF ) { if(car == ';') { if(esComentario(fd)) else buscarFinLinea(fd); } else if((car >= 'A' && car <= 'Z')||(car >= 'a' && car <= 'z')) { etiqueta = Etiqueta_Codop_Operando(fd,ETIQUETA); printf("\nETIQUETA = %s\n",etiqueta ); erroresEtiqueta(etiqueta); ignorarEspacios(fd); codop = Etiqueta_Codop_Operando(fd,CODOP); ignorarEspacios(fd); operando = Etiqueta_Codop_Operando(fd,OPERANDO); printf("OPERANDO = %s\n\n",operando ); } } } else printf("No se pudo abrir el archivo"); return 0; } booleano esComentario(FILE *fd) { int car; while((car = fgetc(fd ))!= '\n') { if(car == ';') return 0; } return 1; } void buscarFinLinea(FILE *fd) { int car; while((car = fgetc(fd ))!= '\n') ; } void ignorarEspacios(FILE *fd) { int car; do { }while(car == '\t' || car == ' '); } booleano esLetra(char *etiqueta,int i) { if((etiqueta[i] >= 'A' && etiqueta[i] <= 'Z')||(etiqueta[i] >= 'a' && etiqueta[i] <= 'z')) return 1; else return 0; } booleano esNumero(char *etiqueta,int i) { if(etiqueta[i] >= '0' && etiqueta[i] <= '9') return 1; else return 0; } char *Etiqueta_Codop_Operando(FILE *fd,int linea) { int car,lon = 0,pos; char *cadena; if(linea == ETIQUETA||linea == CODOP) { do { lon++; }while(car != '\t' && car != ' '); } else { while((car = fgetc(fd )) != '\n') lon++; } return cadena; } void erroresEtiqueta(char *etiqueta) { int tam,i,caracterInvalido = 0; if(tam-1 > LONG_ETIQUETA) printf("\tError:la longitud maxima de una etiqueta es de ocho caracteres\n"); for(i = 0;(i < tam)&&(caracterInvalido);i++) { if((!esLetra(etiqueta,i))&&(!esNumero(etiqueta,i))&&(!etiqueta[i] == '_')) caracterInvalido = 1; } if(caracterInvalido) printf("Error:los caracteres validos en las etiquetas son letras, digitos(0..9) y el guion bajo\n"); }
el resto del codigo funciona bien, solo tengo problema con esa parte gracias
|
|
|
En línea
|
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
Creo que es más útil el uso de isalpha e isdigit para saber si son alfabéticos o números los caracteres.
Respecto al código sólo vi un fallo en las funciones esLetra y esNumero, ya que su argumento no es una cadena sino un caracter.
En fin, supongo que esta es la salida que buscabas:Et1 equ CODOP = equ $ffFF OPERANDO = $ffFF
dos LDAA CODOP = LDAA @4732 OPERANDO = @4732
COMENTARIO COMENTARIO tres sWi CODOP = sWi x,5 OPERANDO = x,5
Netq%23 Error:los caracteres validos en las etiquetas son letras, digitos(0..9) y el gui on bajo RMB CODOP = RMB 556 OPERANDO = 556
Et12_xyz12 Error:la longitud maxima de una etiqueta es de ocho caracteres ADCA CODOP = ADCA
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #define LONG_ETIQUETA 8 #define LONG_CODOPS 5 typedef enum {FALSO,VERDADERO} booleano; typedef enum {ETIQUETA,CODOP,OPERANDO} linea; booleano esComentario(FILE *fd); char *Etiqueta_Codop_Operando(FILE *fd,int linea); void erroresEtiqueta(char *etiqueta); void buscarFinLinea(FILE *fd); void ignorarEspacios(FILE *fd); booleano esNumero(char caracter); booleano esLetra(char caracter); int main() { FILE *fd; int car; char *etiqueta,*codop,*operando; if((fd = fopen("P1ASM.txt","r"))!= NULL) { while((car = fgetc(fd))!= EOF) { if(car == ';') { if(esComentario(fd)) printf("COMENTARIO\n"); else buscarFinLinea(fd); } else if((isalpha(car))) { etiqueta = Etiqueta_Codop_Operando(fd,ETIQUETA); erroresEtiqueta(etiqueta); ignorarEspacios(fd); codop = Etiqueta_Codop_Operando(fd,CODOP); printf("CODOP = %s\n",codop); ignorarEspacios(fd); operando = Etiqueta_Codop_Operando(fd,OPERANDO); printf("OPERANDO = %s\n\n",operando); } } } else printf("No se pudo abrir el archivo"); return 0; } booleano esComentario(FILE *fd) { int car; while((car = fgetc(fd))!= '\n') { if(car == ';') return 0; } return 1; } void buscarFinLinea(FILE *fd) { int car; while((car = fgetc(fd))!= '\n') ; } void ignorarEspacios(FILE *fd) { int car; do { car = fgetc(fd); }while(car == '\t' || car == ' '); } booleano esLetra(char caracter) { if (isalpha(caracter)) return 1; else return 0; } booleano esNumero(char caracter) { if (isdigit(caracter)) return 1; else return 0; } char *Etiqueta_Codop_Operando(FILE *fd,int linea) { int car,lon = 0,pos; char *cadena; fseek(fd,-1,SEEK_CUR); pos = ftell(fd); if(linea == ETIQUETA||linea == CODOP) { do { car = fgetc(fd); lon++; }while(car != '\t' && car != ' '); } else { while((car = fgetc(fd)) != '\n') lon++; } cadena = calloc((lon+1),1); fseek(fd,pos,SEEK_SET); fgets(cadena,lon+1,fd); printf ("%s \n",cadena); ; return cadena; } void erroresEtiqueta(char *etiqueta) { int tam,i,caracterInvalido = 0; tam = strlen(etiqueta); if(tam-1 > LONG_ETIQUETA) printf("\tError:la longitud maxima de una etiqueta es de ocho caracteres\n"); for(i = 0;i<tam-1;i++) { if(!(esLetra(etiqueta[i]))&&(!esNumero(etiqueta[i]))&& (etiqueta[i] != '_')){ caracterInvalido = 1; } } if(caracterInvalido==1) printf("Error:los caracteres validos en las etiquetas son letras, digitos(0..9) y el guion bajo\n"); }
¡¡¡¡ Saluditos! ..... !!!!
|
|
« Última modificación: 27 Diciembre 2013, 09:04 am por leosansan »
|
En línea
|
|
|
|
m@o_614
Desconectado
Mensajes: 389
|
Gracias leosansan por tu respuesta, yo crei que al hacer esto: esLetra(etiqueta,i) le estaba enviando un solo elemento de la cadena, lo que equivaldria a un caracter, para ya despues en la funcion poder hacer esto: if((etiqueta[i] >= 'A' && etiqueta[i] <= 'Z')||(etiqueta[i] >= 'a' && etiqueta[i] <= 'z')) return 1;
pero me queda una duda, si yo por ejemplo le agregara la regla de: los codigos de operacion deben iniciar con letra a los CODOPS e hiciera una funcion para verificar los errores de CODOPS, en este caso el if(!esLetra(codop,i)) si funciona y si me imprime el mensaje de error, cosa que no hace con la verificacion de errores en etiquetas por que es esto? void erroresCodop(char *codop) { int tam,i = 0; if(tam-1 > LONG_CODOP) printf("\tError:la longitud maxima de un codigo de operacion es de 5 caracteres\n"); if(!esLetra(codop,i)) printf("\tError:los codigos de operacion deben iniciar con letra\n"); }
el codigo completo era este: #include <stdio.h> #include <stdlib.h> #include <string.h> #define LONG_ETIQUETA 8 #define LONG_CODOP 5 typedef enum {FALSO,VERDADERO} booleano; typedef enum {ETIQUETA,CODOP,OPERANDO} linea; booleano esComentario(FILE *fd); char *Etiqueta_Codop_Operando(FILE *fd,int linea); void erroresEtiqueta(char *etiqueta); void erroresCodop(char *codop); void buscarFinLinea(FILE *fd); void ignorarEspacios(FILE *fd); booleano esNumero(char caracter[],int i); booleano esLetra(char caracter[],int i); int main() { FILE *fd; int car; char *etiqueta,*codop,*operando; if((fd = fopen("P1ASM.txt","r"))!= NULL ) { while((car = fgetc(fd ))!= EOF ) { if(car == ';') { if(esComentario(fd)) else buscarFinLinea(fd); } else if((car >= 'A' && car <= 'Z')||(car >= 'a' && car <= 'z')) { etiqueta = Etiqueta_Codop_Operando(fd,ETIQUETA); printf("\nETIQUETA = %s\n",etiqueta ); erroresEtiqueta(etiqueta); ignorarEspacios(fd); codop = Etiqueta_Codop_Operando(fd,CODOP); erroresCodop(codop); ignorarEspacios(fd); operando = Etiqueta_Codop_Operando(fd,OPERANDO); printf("OPERANDO = %s\n\n",operando ); } } } else printf("No se pudo abrir el archivo"); return 0; } booleano esComentario(FILE *fd) { int car; while((car = fgetc(fd ))!= '\n') { if(car == ';') return 0; } return 1; } void buscarFinLinea(FILE *fd) { int car; while((car = fgetc(fd ))!= '\n') ; } void ignorarEspacios(FILE *fd) { int car; do { }while(car == '\t' || car == ' '); } booleano esLetra(char caracter[],int i) { if((caracter[i] >= 'A' && caracter[i] <= 'Z')||(caracter[i] >= 'a' && caracter[i] <= 'z')) return 1; else return 0; } booleano esNumero(char caracter[],int i) { if(caracter[i] >= '0' && caracter[i] <= '9') return 1; else return 0; } char *Etiqueta_Codop_Operando(FILE *fd,int linea) { int car,lon = 0,pos; char *cadena; if(linea == ETIQUETA||linea == CODOP) { do { lon++; }while(car != '\t' && car != ' '); } else { while((car = fgetc(fd )) != '\n') lon++; } return cadena; } void erroresEtiqueta(char *etiqueta) { int tam,i = 0,caracterInvalido = 0; if(tam-1 > LONG_ETIQUETA) printf("\tError:la longitud maxima de una etiqueta es de 8 caracteres\n"); for(i = 0;(i < tam)&&(caracterInvalido);i++) { if((!esLetra(etiqueta,i))&&(!esNumero(etiqueta,i))&&(etiqueta[i] != '_')) caracterInvalido = 1; } if(caracterInvalido == 1) printf("Error:los caracteres validos en las etiquetas son letras, digitos(0..9) y el guion bajo\n"); } void erroresCodop(char *codop) { int tam,i = 0; if(tam-1 > LONG_CODOP) printf("\tError:la longitud maxima de un codigo de operacion es de 5 caracteres\n"); if(!esLetra(codop,i)) printf("\tError:los codigos de operacion deben iniciar con letra\n"); }
gracias y felices fiestas
|
|
« Última modificación: 27 Diciembre 2013, 21:52 pm por m@o_614 »
|
En línea
|
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
Mejor ves la salida al problema que planteas, donde he modificado lo del carácter y en calloc he añadido el segundo argumento: size char =1. También cambié en el fichero original el COPS swi a 1swi para que cante el error:#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #define LONG_ETIQUETA 8 #define LONG_CODOPS 5 typedef enum {FALSO,VERDADERO} booleano; typedef enum {ETIQUETA,CODOP,OPERANDO} linea; booleano esComentario(FILE *fd); char *Etiqueta_Codop_Operando(FILE *fd,int linea); void erroresEtiqueta(char *etiqueta); void buscarFinLinea(FILE *fd); void ignorarEspacios(FILE *fd); booleano esNumero(char caracter); booleano esLetra(char caracter); void erroresCodop(char *codop); int main() { FILE *fd; int car; char *etiqueta,*codop,*operando; if((fd = fopen("P1ASM.txt","r"))!= NULL) { while((car = fgetc(fd))!= EOF) { if(car == ';') { if(esComentario(fd)) printf("COMENTARIO\n"); else buscarFinLinea(fd); } else if((isalpha(car))) { etiqueta = Etiqueta_Codop_Operando(fd,ETIQUETA); printf("\nETIQUETA = %s\n",etiqueta); erroresEtiqueta(etiqueta); ignorarEspacios(fd); codop = Etiqueta_Codop_Operando(fd,CODOP); printf("CODOP = %s\n",codop); erroresCodop(codop); ignorarEspacios(fd); operando = Etiqueta_Codop_Operando(fd,OPERANDO); printf("OPERANDO = %s\n\n",operando); } } } else printf("No se pudo abrir el archivo"); return 0; } booleano esComentario(FILE *fd) { int car; while((car = fgetc(fd))!= '\n') { if(car == ';') return 0; } return 1; } void buscarFinLinea(FILE *fd) { int car; while((car = fgetc(fd))!= '\n') ; } void ignorarEspacios(FILE *fd) { int car; do { car = fgetc(fd); }while(car == '\t' || car == ' '); } booleano esLetra(char caracter) { if (isalpha(caracter)) return 1; else return 0; } booleano esNumero(char caracter) { if (isdigit(caracter)) return 1; else return 0; } char *Etiqueta_Codop_Operando(FILE *fd,int linea) { int car,lon = 0,pos; char *cadena; fseek(fd,-1,SEEK_CUR); pos = ftell(fd); if(linea == ETIQUETA||linea == CODOP) { do { car = fgetc(fd); lon++; }while(car != '\t' && car != ' '); } else { while((car = fgetc(fd)) != '\n') lon++; } cadena = calloc((lon+1),1); fseek(fd,pos,SEEK_SET); fgets(cadena,lon+1,fd); printf ("%s \n",cadena); ; return cadena; } void erroresEtiqueta(char *etiqueta) { int tam,i,caracterInvalido = 0; tam = strlen(etiqueta); if(tam-1 > LONG_ETIQUETA) printf("\tError:la longitud maxima de una etiqueta es de ocho caracteres\n"); for(i = 0;i<tam-1;i++) { if(!(esLetra(etiqueta[i]))&&(!esNumero(etiqueta[i]))&& (etiqueta[i] != '_')){ caracterInvalido = 1; } } if(caracterInvalido==1) printf("Error:los caracteres validos en las etiquetas son letras, digitos(0..9) y el guion bajo\n"); } void erroresCodop(char *codop) { int tam,i = 0; tam = strlen(codop); if(tam-1 > LONG_CODOPS) printf("\tError:la longitud maxima de un codigo de operacion es de 5 caracteres\n"); if(!esLetra(codop[0])) printf("\tError:los codigos de operacion deben iniciar con letra\n"); }
¡¡¡¡ Saluditos! ..... !!!!
|
|
|
En línea
|
|
|
|
m@o_614
Desconectado
Mensajes: 389
|
ya supe donde estaba el error, en la bandera esEtiqueta, tuve que inicializarla a 1 porque si no no funcionaba y tambien por ejemplo en la etiqueta dos tambien me estaba leyendo dos mas un espacio en blanco y por eso me aparecia que todas las etiquetas tenian error, porque ese ' ' no es ni letra, ni digito ni guion bajo #include <stdio.h> #include <stdlib.h> #include <string.h> #define LONG_ETIQUETA 8 #define LONG_CODOP 5 typedef enum {FALSO,VERDADERO} booleano; typedef enum {ETIQUETA,CODOP,OPERANDO} linea; booleano esComentario(FILE *fd); char *Etiqueta_Codop_Operando(FILE *fd,int linea); void erroresEtiqueta(char *etiqueta); void erroresCodop(char *codop); void buscarFinLinea(FILE *fd); void ignorarEspacios(FILE *fd); booleano esNumero(char caracter); booleano esLetra(char caracter); int main() { FILE *fd; int car; char *etiqueta,*codop,*operando; if((fd = fopen("P1ASM.txt","r"))!= NULL ) { while((car = fgetc(fd ))!= EOF ) { if(car == ';') { if(esComentario(fd)) else buscarFinLinea(fd); } else if(esLetra(car)) { etiqueta = Etiqueta_Codop_Operando(fd,ETIQUETA); printf("\nETIQUETA = %s\n",etiqueta ); erroresEtiqueta(etiqueta); ignorarEspacios(fd); codop = Etiqueta_Codop_Operando(fd,CODOP); erroresCodop(codop); ignorarEspacios(fd); operando = Etiqueta_Codop_Operando(fd,OPERANDO); printf("OPERANDO = %s\n\n",operando ); } } } else printf("No se pudo abrir el archivo"); return 0; } booleano esComentario(FILE *fd) { int car; while((car = fgetc(fd ))!= '\n') { if(car == ';') return 0; } return 1; } void buscarFinLinea(FILE *fd) { int car; while((car = fgetc(fd ))!= '\n') ; } void ignorarEspacios(FILE *fd) { int car; do { }while(car == '\t' || car == ' '); } booleano esLetra(char caracter) { if((caracter >= 'A' && caracter <= 'Z')||(caracter >= 'a' && caracter <= 'z')) return 1; else return 0; } booleano esNumero(char caracter) { if(caracter >= '0' && caracter <= '9') return 1; else return 0; } char *Etiqueta_Codop_Operando(FILE *fd,int linea) { int car,lon = 0,pos; char *cadena; if(linea == ETIQUETA||linea == CODOP) { do { lon++; }while(car != '\t' && car != ' '); } else { while((car = fgetc(fd )) != '\n') lon++; } cadena = (char*)calloc((lon +1),sizeof(char)); return cadena; } void erroresEtiqueta(char *etiqueta) { int tam,i = 0,esEtiqueta = 1; if(tam-1 > LONG_ETIQUETA) printf("\tError:la longitud maxima de una etiqueta es de 8 caracteres\n"); for(i = 0;(i < tam-1)&&(esEtiqueta);i++) { if((!esLetra(etiqueta[i]))&&(!esNumero(etiqueta[i]))&&(etiqueta[i] != '_')) esEtiqueta = 0; } if(!esEtiqueta) printf("\tError:los caracteres validos en las etiquetas son letras, digitos(0..9) y el guion bajo\n"); } void erroresCodop(char *codop) { int tam,i = 0,esCodop = 1,punto = 0; if(tam-1 > LONG_CODOP) printf("\tError:la longitud maxima de un codigo de operacion es de 5 caracteres\n"); if(!esLetra(codop[i])) printf("\tError:los codigos de operacion deben iniciar con letra\n"); else { for(i = 1;(i < tam-1)&&(esCodop)&&(punto>=0&&punto<=1);i++) { if((!esLetra(codop[i]))&&(codop[i] != '.')) esCodop = 0; else if(codop[i] == '.') punto++; } if(!esCodop) printf("\tError:los caracteres validos en los codigos de operacion son letras y el caracter punto\n"); if(punto > 1) printf("\tError:los codigos de operacion no pueden tener mas de un punto\n"); } }
pero yo todavia no entiendo por que no puedo inicializar la bandera con 0 aqui ya no hace lo que le pido void erroresEtiqueta(char *etiqueta) { int tam,i = 0,esEtiqueta = 0; if(tam-1 > LONG_ETIQUETA) printf("\tError:la longitud maxima de una etiqueta es de 8 caracteres\n"); for(i = 0;(i < tam-1)&&(esEtiqueta);i++) { if((!esLetra(etiqueta[i]))&&(!esNumero(etiqueta[i]))&&(etiqueta[i] != '_')) esEtiqueta = 1; } if(esEtiqueta == 1) printf("\tError:los caracteres validos en las etiquetas son letras, digitos(0..9) y el guion bajo\n"); }
|
|
|
En línea
|
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
Ya no sé que decir, tal como te lo puse en el post anterior funcionaba O.K.
Es como el no uso que haces de las funciones que te indiqué para saber si los caracteres son alfabéticos o numérico. Son más "elegantes/profesionales" que las de andar viendo si el código ASCII está entre tales y cuales números. Y por cierto, sizeof(char) en cualquier plataforma vale 1, que es lo que puse en mi código. Míralo bien.¡¡¡¡ Saluditos! ..... !!!!
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
algun programa para quemar cd,s en partes??
Software
|
kumbiero51
|
2
|
3,468
|
10 Octubre 2007, 16:05 pm
por EL QUE ES
|
|
|
[Resuelto] Como Crear un programa que "identifique cada linea de un textbox"???
Programación Visual Basic
|
agus0
|
8
|
4,580
|
20 Diciembre 2009, 00:27 am
por agus0
|
|
|
Sony exige a YouTube que identifique a los autores de un vídeo de desbloqueo PS3
Noticias
|
Silici0
|
0
|
1,568
|
10 Febrero 2011, 11:47 am
por Silici0
|
|
|
Programa que identifique que tipo de dato se introduce C++
« 1 2 »
Programación C/C++
|
minari02
|
17
|
16,523
|
11 Febrero 2014, 02:48 am
por rir3760
|
|
|
¿Cómo es posible que te identifique?
PHP
|
Zarlok
|
3
|
4,256
|
23 Agosto 2014, 00:36 am
por #!drvy
|
|