Hack x Crack - Comunidad de Seguridad informática

Programación => C / C++ => Mensaje iniciado por: Pino1952 en Diciembre 29, 2014, 07:00:56 pm

Título: Llamar a un array de punteros a caracteres de una forma inusual.[C]
Publicado por: Pino1952 en Diciembre 29, 2014, 07:00:56 pm
Hola a todos.
Nuevamente por aquí, el enunciado del libro con el que estoy estudiando dice:
Citar
Escriba un programa que lea un carácter desde el teclado y que pruebe el carácter con cada una de las funciones de la biblioteca de manipulación de caracteres.
Como no quiero utilizar 20 if ni switch se me antojo hacerlo de esta manera, obviamente me da un error que no puedo solucionar, me podrían informar si esto es posible o si estoy proponiendo un disparate.-   
 
Código: C
  1. #include<stdio.h>
  2. #include<string.h>
  3.  
  4. int main(int argc,char **argv){
  5.         char a, *funManCad[] = {"islower", "isupper", "isdigit"};
  6.         char *mensaje[] = {"una letra minuscula", "una letra mayuscula", "un numero"};
  7.         int i;
  8.        
  9.         printf("\n Ingrese un caracter cualquiera [confirme con Enter]...:");
  10.         a = getchar();
  11.         for(i=0; i<3; i++){
  12.                 if(funManCad[i](a)){
  13.                         printf("\n Ingreso %s", mensaje[i]);
  14.                 }      
  15.         }
  16.        
  17.         printf("\n\n Pulse [Enter] para finalizar..."); getchar();getchar();
  18.         return 0;
  19. }

Como podrán notar me faltan un montón de funciones, esto sólo es una prueba.- 

Saludos.
Daniel
Título: Re:Llamar a un array de punteros a caracteres de una forma inusual.[C]
Publicado por: stakewinner00 en Diciembre 29, 2014, 08:35:33 pm
Si he entendido bien lo que quieres hacer es usar punteros a funciones? Tipo
Código: C
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. size_t (*p)(const char*);
  5.  
  6. int main()
  7. {
  8.   p = &strlen;
  9.   printf("%d", p("Hello world!"));
  10. }
Título: Re:Llamar a un array de punteros a caracteres de una forma inusual.[C]
Publicado por: bum3r en Diciembre 29, 2014, 09:02:03 pm
Estas en buen camino, solo te falto un poco
http://www.ib.cnea.gov.ar/~icom/web/puntfunc.html Esto te va a servir.
Saludos
Título: Re:Llamar a un array de punteros a caracteres de una forma inusual.[C]
Publicado por: ksha en Diciembre 29, 2014, 09:28:12 pm
Te dejo la mejor opción que probé:

Código: [Seleccionar]
#include<stdio.h>
#include<string.h>
 
int main(int argc,char **argv){
char a;
char *mensaje[] = {"una letra minuscula", "una letra mayuscula", "un numero"};
 
printf("\n Ingrese un caracter cualquiera [confirme con Enter]...:");
a = getchar();

if(islower(a) != 0) {printf("Es lower\n");}
if(isupper(a) != 0) {printf("Es upper\n");}
if(isdigit(a) != 0) {printf("Es digit\n");}
 
return 0;
}

El error que encontre en tu code al llamar a las funciones dentro de un array, es que tendrias que ejecutar cada funcion como si fuera una shellcode. y trate de hacerlo funcionar pero me da errores de violaciones de segmento y ademas accesos no manipulados de la memoria del OS.
Título: Re:Llamar a un array de punteros a caracteres de una forma inusual.[C]
Publicado por: bum3r en Diciembre 29, 2014, 09:58:38 pm
Te dejo la mejor opción que probé:

Código: [Seleccionar]
#include<stdio.h>
#include<string.h>
 
int main(int argc,char **argv){
char a;
char *mensaje[] = {"una letra minuscula", "una letra mayuscula", "un numero"};
 
printf("\n Ingrese un caracter cualquiera [confirme con Enter]...:");
a = getchar();

if(islower(a) != 0) {printf("Es lower\n");}
if(isupper(a) != 0) {printf("Es upper\n");}
if(isdigit(a) != 0) {printf("Es digit\n");}
 
return 0;
}

El error que encontre en tu code al llamar a las funciones dentro de un array, es que tendrias que ejecutar cada funcion como si fuera una shellcode. y trate de hacerlo funcionar pero me da errores de violaciones de segmento y ademas accesos no manipulados de la memoria del OS.

Disculpá mi intromisión Pero el programa que el hizo anda bien, ademas que tiene que tratar mas funciones.
y lo que el no sabia es como como crear un array de funciones..

Código: [Seleccionar]
#include <stdio.h>
#include <string.h>
#include <ctype.h>

int main(int argc,char **argv){

int (*pFun[3])(char )={ islower, isupper, isdigit};
char a,*mensaje[] = {"una letra minuscula", "una letra mayuscula", "un numero"};
int i;
   
printf("\n Ingrese un caracter cualquiera [confirme con Enter]...:");
a = getchar();

for(i=0; i<3; i++){
  if( pFun[i]( a ) ){
   printf("\n Ingreso %s", mensaje[i]);
  }   
}
 
 printf("\n\n Pulse [Enter] para finalizar..."); getchar();getchar();
 return 0;
}

Un cordial saludo!
Título: Re:Llamar a un array de punteros a caracteres de una forma inusual.[C]
Publicado por: Pino1952 en Diciembre 29, 2014, 10:32:41 pm
Hola.
Muchas gracias a los tres por ocuparse.-
stakewinner00, esa era la idea, sólo que no sabía llevara a la práctica.-
Ksha, eso es precisamente lo que no quería hacer, utilizar más de un if.-
Bum3r, tú código es lo que quería lograr, compila con muchos errores pero el resultado es correcto.- 

(http://i62.tinypic.com/wa0xky.png)

Saludos.
Daniel
Título: Re:Llamar a un array de punteros a caracteres de una forma inusual.[C]
Publicado por: stakewinner00 en Diciembre 29, 2014, 10:48:27 pm
Los warnings salen porque las funciones islower, isupper, isdigit están declaradas como que entra un int y sale un int
Citar
        #include <ctype.h>

       int isalnum(int c);
       int isalpha(int c);
       int isascii(int c);
       int isblank(int c);
       int iscntrl(int c);
       int isdigit(int c);
       int isgraph(int c);
       int islower(int c);
       int isprint(int c);
       int ispunct(int c);
       int isspace(int c);
       int isupper(int c);
       int isxdigit(int c);

Por tanto la línea 7 quedaría "int (*pFun[3])(int )={ islower, isupper, isdigit};"

Título: Re:Llamar a un array de punteros a caracteres de una forma inusual.[C]
Publicado por: Pino1952 en Diciembre 29, 2014, 10:59:48 pm
Hola.
Excelente, funciona a la perfección.-

Muchas gracias a todos y saludos.
Daniel