elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Programa identifique partes de una linea
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Programa identifique partes de una linea  (Leído 2,850 veces)
m@o_614


Desconectado Desconectado

Mensajes: 389


Ver Perfil
Programa identifique partes de una linea
« en: 27 Diciembre 2013, 04:45 am »

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

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define LONG_ETIQUETA 8
  5. #define LONG_CODOPS 5
  6.  
  7. typedef enum {FALSO,VERDADERO} booleano;
  8. typedef enum {ETIQUETA,CODOP,OPERANDO} linea;
  9.  
  10. booleano esComentario(FILE *fd);
  11. char *Etiqueta_Codop_Operando(FILE *fd,int linea);
  12. void erroresEtiqueta(char *etiqueta);
  13. void buscarFinLinea(FILE *fd);
  14. void ignorarEspacios(FILE *fd);
  15. booleano esNumero(char cadena[],int i);
  16. booleano esLetra(char cadena[],int i);
  17.  
  18. int main()
  19. {
  20.    FILE *fd;
  21.    int car;
  22.    char *etiqueta,*codop,*operando;
  23.    if((fd = fopen("P1ASM.txt","r"))!= NULL)
  24.    {
  25.        while((car = fgetc(fd))!= EOF)
  26.        {
  27.            if(car == ';')
  28.            {
  29.                if(esComentario(fd))
  30.                   printf("COMENTARIO\n");
  31.                else
  32.                   buscarFinLinea(fd);
  33.            }
  34.            else if((car >= 'A' && car <= 'Z')||(car >= 'a' && car <= 'z'))
  35.            {
  36.                etiqueta = Etiqueta_Codop_Operando(fd,ETIQUETA);
  37.                printf("\nETIQUETA = %s\n",etiqueta);
  38.                erroresEtiqueta(etiqueta);
  39.                ignorarEspacios(fd);
  40.                codop = Etiqueta_Codop_Operando(fd,CODOP);
  41.                printf("CODOP = %s\n",codop);
  42.                ignorarEspacios(fd);
  43.                operando = Etiqueta_Codop_Operando(fd,OPERANDO);
  44.                printf("OPERANDO = %s\n\n",operando);
  45.            }
  46.        }
  47.    }
  48.    else
  49.       printf("No se pudo abrir el archivo");
  50.    return 0;
  51. }
  52.  
  53. booleano esComentario(FILE *fd)
  54. {
  55.    int car;
  56.    while((car = fgetc(fd))!= '\n')
  57.    {
  58.        if(car == ';')
  59.           return 0;
  60.    }
  61.    return 1;
  62. }
  63.  
  64. void buscarFinLinea(FILE *fd)
  65. {
  66.    int car;
  67.    while((car = fgetc(fd))!= '\n')
  68.        ;
  69. }
  70.  
  71. void ignorarEspacios(FILE *fd)
  72. {
  73.    int car;
  74.    do
  75.    {
  76.        car = fgetc(fd);
  77.    }while(car == '\t' || car == ' ');
  78. }
  79.  
  80. booleano esLetra(char *etiqueta,int i)
  81. {
  82.    if((etiqueta[i] >= 'A' && etiqueta[i] <= 'Z')||(etiqueta[i] >= 'a' && etiqueta[i] <= 'z'))
  83.       return 1;
  84.    else
  85.       return 0;
  86. }
  87.  
  88. booleano esNumero(char *etiqueta,int i)
  89. {
  90.    if(etiqueta[i] >= '0' && etiqueta[i] <= '9')
  91.       return 1;
  92.    else
  93.       return 0;
  94. }
  95.  
  96. char *Etiqueta_Codop_Operando(FILE *fd,int linea)
  97. {
  98.    int car,lon = 0,pos;
  99.    char *cadena;
  100.    fseek(fd,-1,SEEK_CUR);
  101.    pos = ftell(fd);
  102.    if(linea == ETIQUETA||linea == CODOP)
  103.    {
  104.        do
  105.        {
  106.            car = fgetc(fd);
  107.            lon++;
  108.        }while(car != '\t' && car != ' ');
  109.    }
  110.    else
  111.    {
  112.        while((car = fgetc(fd)) != '\n')
  113.           lon++;
  114.    }
  115.    cadena = calloc((lon+1));
  116.    fseek(fd,pos,SEEK_SET);
  117.    fgets(cadena,lon+1,fd);
  118.    return cadena;
  119. }
  120.  
  121. void erroresEtiqueta(char *etiqueta)
  122. {
  123.    int tam,i,caracterInvalido = 0;
  124.    tam = strlen(etiqueta);
  125.    if(tam-1 > LONG_ETIQUETA)
  126.       printf("\tError:la longitud maxima de una etiqueta es de ocho caracteres\n");
  127.    for(i = 0;(i < tam)&&(caracterInvalido);i++)
  128.    {
  129.        if((!esLetra(etiqueta,i))&&(!esNumero(etiqueta,i))&&(!etiqueta[i] == '_'))
  130.           caracterInvalido = 1;
  131.    }
  132.    if(caracterInvalido)
  133.       printf("Error:los caracteres validos en las etiquetas son letras, digitos(0..9) y el guion bajo\n");
  134. }
  135.  

el resto del codigo funciona bien, solo tengo problema con esa parte

gracias


En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Programa identifique partes de una linea
« Respuesta #1 en: 27 Diciembre 2013, 08:59 am »

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:


Citar
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

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <ctype.h>
  5. #define LONG_ETIQUETA 8
  6. #define LONG_CODOPS 5
  7.  
  8. typedef enum {FALSO,VERDADERO} booleano;
  9. typedef enum {ETIQUETA,CODOP,OPERANDO} linea;
  10.  
  11. booleano esComentario(FILE *fd);
  12. char *Etiqueta_Codop_Operando(FILE *fd,int linea);
  13. void erroresEtiqueta(char *etiqueta);
  14. void buscarFinLinea(FILE *fd);
  15. void ignorarEspacios(FILE *fd);
  16. booleano esNumero(char caracter);
  17. booleano esLetra(char caracter);
  18.  
  19. int main()
  20. {
  21.    FILE *fd;
  22.    int car;
  23.    char *etiqueta,*codop,*operando;
  24.    if((fd = fopen("P1ASM.txt","r"))!= NULL)
  25.    {
  26.        while((car = fgetc(fd))!= EOF)
  27.        {
  28.            if(car == ';')
  29.            {
  30.                if(esComentario(fd))
  31.                   printf("COMENTARIO\n");
  32.                else
  33.                   buscarFinLinea(fd);
  34.            }
  35.            else if((isalpha(car)))
  36.            {
  37.                etiqueta = Etiqueta_Codop_Operando(fd,ETIQUETA);
  38.                erroresEtiqueta(etiqueta);
  39.                ignorarEspacios(fd);
  40.                codop = Etiqueta_Codop_Operando(fd,CODOP);
  41.                printf("CODOP = %s\n",codop);
  42.                ignorarEspacios(fd);
  43.                operando = Etiqueta_Codop_Operando(fd,OPERANDO);
  44.                printf("OPERANDO = %s\n\n",operando);
  45.            }
  46.        }
  47.    }
  48.    else
  49.       printf("No se pudo abrir el archivo");
  50.    return 0;
  51. }
  52.  
  53. booleano esComentario(FILE *fd)
  54. {
  55.    int car;
  56.    while((car = fgetc(fd))!= '\n')
  57.    {
  58.        if(car == ';')
  59.           return 0;
  60.    }
  61.    return 1;
  62. }
  63.  
  64. void buscarFinLinea(FILE *fd)
  65. {
  66.    int car;
  67.    while((car = fgetc(fd))!= '\n')
  68.        ;
  69. }
  70.  
  71. void ignorarEspacios(FILE *fd)
  72. {
  73.    int car;
  74.    do
  75.    {
  76.        car = fgetc(fd);
  77.    }while(car == '\t' || car == ' ');
  78. }
  79.  
  80. booleano esLetra(char caracter)
  81. {
  82.    if (isalpha(caracter))
  83.        return 1;
  84.    else
  85.       return 0;
  86. }
  87.  
  88. booleano esNumero(char caracter)
  89. {
  90.    if (isdigit(caracter))
  91.        return 1;
  92.    else
  93.       return 0;
  94. }
  95.  
  96. char *Etiqueta_Codop_Operando(FILE *fd,int linea)
  97. {
  98.    int car,lon = 0,pos;
  99.    char *cadena;
  100.    fseek(fd,-1,SEEK_CUR);
  101.    pos = ftell(fd);
  102.    if(linea == ETIQUETA||linea == CODOP)
  103.    {
  104.        do
  105.        {
  106.            car = fgetc(fd);
  107.            lon++;
  108.        }while(car != '\t' && car != ' ');
  109.    }
  110.    else
  111.    {
  112.        while((car = fgetc(fd)) != '\n')
  113.           lon++;
  114.    }
  115.    cadena = calloc((lon+1),1);
  116.    fseek(fd,pos,SEEK_SET);
  117.    fgets(cadena,lon+1,fd);
  118.    printf ("%s   \n",cadena);
  119. ;
  120.    return cadena;
  121. }
  122.  
  123. void erroresEtiqueta(char *etiqueta)
  124. {
  125.    int tam,i,caracterInvalido = 0;
  126.    tam = strlen(etiqueta);
  127.    if(tam-1 > LONG_ETIQUETA)
  128.       printf("\tError:la longitud maxima de una etiqueta es de ocho caracteres\n");
  129.    for(i = 0;i<tam-1;i++)
  130.    {
  131.        if(!(esLetra(etiqueta[i]))&&(!esNumero(etiqueta[i]))&& (etiqueta[i] != '_')){
  132.  
  133.            caracterInvalido = 1;
  134.        }
  135.  
  136.    }
  137.    if(caracterInvalido==1)
  138.       printf("Error:los caracteres validos en las etiquetas son letras, digitos(0..9) y el guion bajo\n");
  139. }
  140.  

;-)  ;-) Felices Navidades y Próspero Año Nuevo.  ;-)  ;-)

¡¡¡¡ Saluditos! ..... !!!!




« Última modificación: 27 Diciembre 2013, 09:04 am por leosansan » En línea

m@o_614


Desconectado Desconectado

Mensajes: 389


Ver Perfil
Re: Programa identifique partes de una linea
« Respuesta #2 en: 27 Diciembre 2013, 21:49 pm »

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:

Código
  1. if((etiqueta[i] >= 'A' && etiqueta[i] <= 'Z')||(etiqueta[i] >= 'a' && etiqueta[i] <= 'z'))
  2.       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?

Código
  1. void erroresCodop(char *codop)
  2. {
  3.    int tam,i = 0;
  4.    tam = strlen(codop);
  5.    if(tam-1 > LONG_CODOP)
  6.       printf("\tError:la longitud maxima de un codigo de operacion es de 5 caracteres\n");
  7.    if(!esLetra(codop,i))
  8.       printf("\tError:los codigos de operacion deben iniciar con letra\n");
  9. }

el codigo completo era este:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define LONG_ETIQUETA 8
  5. #define LONG_CODOP 5
  6.  
  7. typedef enum {FALSO,VERDADERO} booleano;
  8. typedef enum {ETIQUETA,CODOP,OPERANDO} linea;
  9.  
  10. booleano esComentario(FILE *fd);
  11. char *Etiqueta_Codop_Operando(FILE *fd,int linea);
  12. void erroresEtiqueta(char *etiqueta);
  13. void erroresCodop(char *codop);
  14. void buscarFinLinea(FILE *fd);
  15. void ignorarEspacios(FILE *fd);
  16. booleano esNumero(char caracter[],int i);
  17. booleano esLetra(char caracter[],int i);
  18.  
  19. int main()
  20. {
  21.    FILE *fd;
  22.    int car;
  23.    char *etiqueta,*codop,*operando;
  24.    if((fd = fopen("P1ASM.txt","r"))!= NULL)
  25.    {
  26.        while((car = fgetc(fd))!= EOF)
  27.        {
  28.            if(car == ';')
  29.            {
  30.                if(esComentario(fd))
  31.                   printf("COMENTARIO\n");
  32.                else
  33.                   buscarFinLinea(fd);
  34.            }
  35.            else if((car >= 'A' && car <= 'Z')||(car >= 'a' && car <= 'z'))
  36.            {
  37.                etiqueta = Etiqueta_Codop_Operando(fd,ETIQUETA);
  38.                printf("\nETIQUETA = %s\n",etiqueta);
  39.                erroresEtiqueta(etiqueta);
  40.                ignorarEspacios(fd);
  41.                codop = Etiqueta_Codop_Operando(fd,CODOP);
  42.                printf("CODOP = %s\n",codop);
  43.                erroresCodop(codop);
  44.                ignorarEspacios(fd);
  45.                operando = Etiqueta_Codop_Operando(fd,OPERANDO);
  46.                printf("OPERANDO = %s\n\n",operando);
  47.            }
  48.        }
  49.    }
  50.    else
  51.       printf("No se pudo abrir el archivo");
  52.    return 0;
  53. }
  54.  
  55. booleano esComentario(FILE *fd)
  56. {
  57.    int car;
  58.    while((car = fgetc(fd))!= '\n')
  59.    {
  60.        if(car == ';')
  61.           return 0;
  62.    }
  63.    return 1;
  64. }
  65.  
  66. void buscarFinLinea(FILE *fd)
  67. {
  68.    int car;
  69.    while((car = fgetc(fd))!= '\n')
  70.        ;
  71. }
  72.  
  73. void ignorarEspacios(FILE *fd)
  74. {
  75.    int car;
  76.    do
  77.    {
  78.        car = fgetc(fd);
  79.    }while(car == '\t' || car == ' ');
  80. }
  81.  
  82. booleano esLetra(char caracter[],int i)
  83. {
  84.    if((caracter[i] >= 'A' && caracter[i] <= 'Z')||(caracter[i] >= 'a' && caracter[i] <= 'z'))
  85.       return 1;
  86.    else
  87.       return 0;
  88. }
  89.  
  90. booleano esNumero(char caracter[],int i)
  91. {
  92.    if(caracter[i] >= '0' && caracter[i] <= '9')
  93.       return 1;
  94.    else
  95.       return 0;
  96. }
  97.  
  98. char *Etiqueta_Codop_Operando(FILE *fd,int linea)
  99. {
  100.    int car,lon = 0,pos;
  101.    char *cadena;
  102.    fseek(fd,-1,SEEK_CUR);
  103.    pos = ftell(fd);
  104.    if(linea == ETIQUETA||linea == CODOP)
  105.    {
  106.        do
  107.        {
  108.            car = fgetc(fd);
  109.            lon++;
  110.        }while(car != '\t' && car != ' ');
  111.    }
  112.    else
  113.    {
  114.        while((car = fgetc(fd)) != '\n')
  115.           lon++;
  116.    }
  117.    cadena = calloc(lon+1);
  118.    fseek(fd,pos,SEEK_SET);
  119.    fgets(cadena,lon+1,fd);
  120.    return cadena;
  121. }
  122.  
  123. void erroresEtiqueta(char *etiqueta)
  124. {
  125.    int tam,i = 0,caracterInvalido = 0;
  126.    tam = strlen(etiqueta);
  127.    if(tam-1 > LONG_ETIQUETA)
  128.       printf("\tError:la longitud maxima de una etiqueta es de 8 caracteres\n");
  129.    for(i = 0;(i < tam)&&(caracterInvalido);i++)
  130.    {
  131.        if((!esLetra(etiqueta,i))&&(!esNumero(etiqueta,i))&&(etiqueta[i] != '_'))
  132.           caracterInvalido = 1;
  133.    }
  134.    if(caracterInvalido == 1)
  135.       printf("Error:los caracteres validos en las etiquetas son letras, digitos(0..9) y el guion bajo\n");
  136. }
  137.  
  138. void erroresCodop(char *codop)
  139. {
  140.    int tam,i = 0;
  141.    tam = strlen(codop);
  142.    if(tam-1 > LONG_CODOP)
  143.       printf("\tError:la longitud maxima de un codigo de operacion es de 5 caracteres\n");
  144.    if(!esLetra(codop,i))
  145.       printf("\tError:los codigos de operacion deben iniciar con letra\n");
  146. }
  147.  

gracias y felices fiestas
« Última modificación: 27 Diciembre 2013, 21:52 pm por m@o_614 » En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Programa identifique partes de una linea
« Respuesta #3 en: 28 Diciembre 2013, 00:47 am »


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:



Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <ctype.h>
  5. #define LONG_ETIQUETA 8
  6. #define LONG_CODOPS 5
  7.  
  8. typedef enum {FALSO,VERDADERO} booleano;
  9. typedef enum {ETIQUETA,CODOP,OPERANDO} linea;
  10.  
  11. booleano esComentario(FILE *fd);
  12. char *Etiqueta_Codop_Operando(FILE *fd,int linea);
  13. void erroresEtiqueta(char *etiqueta);
  14. void buscarFinLinea(FILE *fd);
  15. void ignorarEspacios(FILE *fd);
  16. booleano esNumero(char caracter);
  17. booleano esLetra(char caracter);
  18. void erroresCodop(char *codop);
  19.  
  20. int main()
  21. {
  22.    FILE *fd;
  23.    int car;
  24.    char *etiqueta,*codop,*operando;
  25.    if((fd = fopen("P1ASM.txt","r"))!= NULL)
  26.    {
  27.        while((car = fgetc(fd))!= EOF)
  28.        {
  29.            if(car == ';')
  30.            {
  31.                if(esComentario(fd))
  32.                   printf("COMENTARIO\n");
  33.                else
  34.                   buscarFinLinea(fd);
  35.            }
  36.            else if((isalpha(car)))
  37.            {
  38.                etiqueta = Etiqueta_Codop_Operando(fd,ETIQUETA);
  39.                printf("\nETIQUETA = %s\n",etiqueta);
  40.                erroresEtiqueta(etiqueta);
  41.                ignorarEspacios(fd);
  42.                codop = Etiqueta_Codop_Operando(fd,CODOP);
  43.                printf("CODOP = %s\n",codop);
  44.                erroresCodop(codop);
  45.                ignorarEspacios(fd);
  46.                operando = Etiqueta_Codop_Operando(fd,OPERANDO);
  47.                printf("OPERANDO = %s\n\n",operando);
  48.            }
  49.        }
  50.    }
  51.    else
  52.       printf("No se pudo abrir el archivo");
  53.    return 0;
  54. }
  55.  
  56. booleano esComentario(FILE *fd)
  57. {
  58.    int car;
  59.    while((car = fgetc(fd))!= '\n')
  60.    {
  61.        if(car == ';')
  62.           return 0;
  63.    }
  64.    return 1;
  65. }
  66.  
  67. void buscarFinLinea(FILE *fd)
  68. {
  69.    int car;
  70.    while((car = fgetc(fd))!= '\n')
  71.        ;
  72. }
  73.  
  74. void ignorarEspacios(FILE *fd)
  75. {
  76.    int car;
  77.    do
  78.    {
  79.        car = fgetc(fd);
  80.    }while(car == '\t' || car == ' ');
  81. }
  82.  
  83. booleano esLetra(char caracter)
  84. {
  85.    if (isalpha(caracter))
  86.        return 1;
  87.    else
  88.       return 0;
  89. }
  90.  
  91. booleano esNumero(char caracter)
  92. {
  93.    if (isdigit(caracter))
  94.        return 1;
  95.    else
  96.       return 0;
  97. }
  98.  
  99. char *Etiqueta_Codop_Operando(FILE *fd,int linea)
  100. {
  101.    int car,lon = 0,pos;
  102.    char *cadena;
  103.    fseek(fd,-1,SEEK_CUR);
  104.    pos = ftell(fd);
  105.    if(linea == ETIQUETA||linea == CODOP)
  106.    {
  107.        do
  108.        {
  109.            car = fgetc(fd);
  110.            lon++;
  111.        }while(car != '\t' && car != ' ');
  112.    }
  113.    else
  114.    {
  115.        while((car = fgetc(fd)) != '\n')
  116.           lon++;
  117.    }
  118.    cadena = calloc((lon+1),1);
  119.    fseek(fd,pos,SEEK_SET);
  120.    fgets(cadena,lon+1,fd);
  121.    printf ("%s   \n",cadena);
  122. ;
  123.    return cadena;
  124. }
  125.  
  126. void erroresEtiqueta(char *etiqueta)
  127. {
  128.    int tam,i,caracterInvalido = 0;
  129.    tam = strlen(etiqueta);
  130.    if(tam-1 > LONG_ETIQUETA)
  131.       printf("\tError:la longitud maxima de una etiqueta es de ocho caracteres\n");
  132.    for(i = 0;i<tam-1;i++)
  133.    {
  134.        if(!(esLetra(etiqueta[i]))&&(!esNumero(etiqueta[i]))&& (etiqueta[i] != '_')){
  135.  
  136.            caracterInvalido = 1;
  137.        }
  138.  
  139.    }
  140.    if(caracterInvalido==1)
  141.       printf("Error:los caracteres validos en las etiquetas son letras, digitos(0..9) y el guion bajo\n");
  142. }
  143. void erroresCodop(char *codop)
  144. {
  145.    int tam,i = 0;
  146.    tam = strlen(codop);
  147.    if(tam-1 > LONG_CODOPS)
  148.       printf("\tError:la longitud maxima de un codigo de operacion es de 5 caracteres\n");
  149.    if(!esLetra(codop[0]))
  150.       printf("\tError:los codigos de operacion deben iniciar con letra\n");
  151. }
  152.  

;-)  ;-) Felices Navidades y Próspero Año Nuevo.  ;-)  ;-)

¡¡¡¡ Saluditos! ..... !!!!



En línea

m@o_614


Desconectado Desconectado

Mensajes: 389


Ver Perfil
Re: Programa identifique partes de una linea
« Respuesta #4 en: 28 Diciembre 2013, 02:17 am »

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

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define LONG_ETIQUETA 8
  5. #define LONG_CODOP 5
  6.  
  7. typedef enum {FALSO,VERDADERO} booleano;
  8. typedef enum {ETIQUETA,CODOP,OPERANDO} linea;
  9.  
  10. booleano esComentario(FILE *fd);
  11. char *Etiqueta_Codop_Operando(FILE *fd,int linea);
  12. void erroresEtiqueta(char *etiqueta);
  13. void erroresCodop(char *codop);
  14. void buscarFinLinea(FILE *fd);
  15. void ignorarEspacios(FILE *fd);
  16. booleano esNumero(char caracter);
  17. booleano esLetra(char caracter);
  18.  
  19. int main()
  20. {
  21.    FILE *fd;
  22.    int car;
  23.    char *etiqueta,*codop,*operando;
  24.    if((fd = fopen("P1ASM.txt","r"))!= NULL)
  25.    {
  26.        while((car = fgetc(fd))!= EOF)
  27.        {
  28.            if(car == ';')
  29.            {
  30.                if(esComentario(fd))
  31.                   printf("COMENTARIO\n");
  32.                else
  33.                   buscarFinLinea(fd);
  34.            }
  35.            else if(esLetra(car))
  36.            {
  37.                etiqueta = Etiqueta_Codop_Operando(fd,ETIQUETA);
  38.                printf("\nETIQUETA = %s\n",etiqueta);
  39.                erroresEtiqueta(etiqueta);
  40.                ignorarEspacios(fd);
  41.                codop = Etiqueta_Codop_Operando(fd,CODOP);
  42.                printf("CODOP = %s\n",codop);
  43.                erroresCodop(codop);
  44.                ignorarEspacios(fd);
  45.                operando = Etiqueta_Codop_Operando(fd,OPERANDO);
  46.                printf("OPERANDO = %s\n\n",operando);
  47.            }
  48.        }
  49.    }
  50.    else
  51.       printf("No se pudo abrir el archivo");
  52.    return 0;
  53. }
  54.  
  55. booleano esComentario(FILE *fd)
  56. {
  57.    int car;
  58.    while((car = fgetc(fd))!= '\n')
  59.    {
  60.        if(car == ';')
  61.           return 0;
  62.    }
  63.    return 1;
  64. }
  65.  
  66. void buscarFinLinea(FILE *fd)
  67. {
  68.    int car;
  69.    while((car = fgetc(fd))!= '\n')
  70.        ;
  71. }
  72.  
  73. void ignorarEspacios(FILE *fd)
  74. {
  75.    int car;
  76.    do
  77.    {
  78.        car = fgetc(fd);
  79.    }while(car == '\t' || car == ' ');
  80. }
  81.  
  82. booleano esLetra(char caracter)
  83. {
  84.    if((caracter >= 'A' && caracter <= 'Z')||(caracter >= 'a' && caracter <= 'z'))
  85.       return 1;
  86.    else
  87.       return 0;
  88. }
  89.  
  90. booleano esNumero(char caracter)
  91. {
  92.    if(caracter >= '0' && caracter <= '9')
  93.       return 1;
  94.    else
  95.       return 0;
  96. }
  97.  
  98. char *Etiqueta_Codop_Operando(FILE *fd,int linea)
  99. {
  100.    int car,lon = 0,pos;
  101.    char *cadena;
  102.    fseek(fd,-1,SEEK_CUR);
  103.    pos = ftell(fd);
  104.    if(linea == ETIQUETA||linea == CODOP)
  105.    {
  106.        do
  107.        {
  108.            car = fgetc(fd);
  109.            lon++;
  110.        }while(car != '\t' && car != ' ');
  111.    }
  112.    else
  113.    {
  114.        while((car = fgetc(fd)) != '\n')
  115.           lon++;
  116.    }
  117.    cadena = (char*)calloc((lon+1),sizeof(char));
  118.    fseek(fd,pos,SEEK_SET);
  119.    fgets(cadena,lon+1,fd);
  120.    return cadena;
  121. }
  122.  
  123. void erroresEtiqueta(char *etiqueta)
  124. {
  125.    int tam,i = 0,esEtiqueta = 1;
  126.    tam = strlen(etiqueta);
  127.    if(tam-1 > LONG_ETIQUETA)
  128.       printf("\tError:la longitud maxima de una etiqueta es de 8 caracteres\n");
  129.    for(i = 0;(i < tam-1)&&(esEtiqueta);i++)
  130.    {
  131.        if((!esLetra(etiqueta[i]))&&(!esNumero(etiqueta[i]))&&(etiqueta[i] != '_'))
  132.           esEtiqueta = 0;
  133.    }
  134.    if(!esEtiqueta)
  135.       printf("\tError:los caracteres validos en las etiquetas son letras, digitos(0..9) y el guion bajo\n");
  136. }
  137.  
  138. void erroresCodop(char *codop)
  139. {
  140.    int tam,i = 0,esCodop = 1,punto = 0;
  141.    tam = strlen(codop);
  142.    if(tam-1 > LONG_CODOP)
  143.       printf("\tError:la longitud maxima de un codigo de operacion es de 5 caracteres\n");
  144.    if(!esLetra(codop[i]))
  145.        printf("\tError:los codigos de operacion deben iniciar con letra\n");
  146.    else
  147.    {
  148.        for(i = 1;(i < tam-1)&&(esCodop)&&(punto>=0&&punto<=1);i++)
  149.        {
  150.            if((!esLetra(codop[i]))&&(codop[i] != '.'))
  151.               esCodop = 0;
  152.            else if(codop[i] == '.')
  153.               punto++;
  154.        }
  155.        if(!esCodop)
  156.           printf("\tError:los caracteres validos en los codigos de operacion son letras y el caracter punto\n");
  157.        if(punto > 1)
  158.           printf("\tError:los codigos de operacion no pueden tener mas de un punto\n");
  159.    }
  160. }
  161.  

pero yo todavia no entiendo por que no puedo inicializar la bandera con 0 aqui ya no hace lo que le pido

Código
  1. void erroresEtiqueta(char *etiqueta)
  2. {
  3.    int tam,i = 0,esEtiqueta = 0;
  4.    tam = strlen(etiqueta);
  5.    if(tam-1 > LONG_ETIQUETA)
  6.       printf("\tError:la longitud maxima de una etiqueta es de 8 caracteres\n");
  7.    for(i = 0;(i < tam-1)&&(esEtiqueta);i++)
  8.    {
  9.        if((!esLetra(etiqueta[i]))&&(!esNumero(etiqueta[i]))&&(etiqueta[i] != '_'))
  10.           esEtiqueta = 1;
  11.    }
  12.    if(esEtiqueta == 1)
  13.       printf("\tError:los caracteres validos en las etiquetas son letras, digitos(0..9) y el guion bajo\n");
  14. }
  15.  

En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Programa identifique partes de una linea
« Respuesta #5 en: 28 Diciembre 2013, 10:14 am »

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! ..... !!!!

:rolleyes: ;) ;) ;) :rolleyes:




En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
algun programa para quemar cd,s en partes??
Software
kumbiero51 2 3,286 Último mensaje 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,330 Último mensaje 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,394 Último mensaje 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 15,725 Último mensaje 11 Febrero 2014, 02:48 am
por rir3760
¿Cómo es posible que te identifique?
PHP
Zarlok 3 4,109 Último mensaje 23 Agosto 2014, 00:36 am
por #!drvy
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines