Autor
|
Tema: [C] Llamar a un array de punteros a caracteres en un bucle. (Leído 3,267 veces)
|
DanielPy
Desconectado
Mensajes: 145
|
Hola a todos. El enunciado del libro con el que estoy estudiando dice: 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 100 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.- #include<stdio.h> #include<string.h> int main(int argc,char **argv){ char a, *funManCad[] = {"islower", "isupper", "isdigit"}; char *mensaje[] = {"una letra minuscula", "una letra mayuscula", "un numero"}; int i; printf("\n Ingrese un caracter cualquiera [confirme con Enter]...:"); for(i=0; i<3; i++){ if(funManCad[i](a)){ printf("\n Ingreso %s", mensaje [i ]); } } printf("\n\n Pulse [Enter] para finalizar..."); getchar();getchar (); return 0; }
A simple vista se nota que me faltan muchas funciones, pero esto es sólo para la consulta.- Saludos. Daniel
|
|
|
En línea
|
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
|
|
|
crack81
Desconectado
Mensajes: 222
|
Hay varias forma de hacerlo pero esta me parecio mas similar a como lo quieres eso de poner char a, *funManCad[] = {"islower", "isupper", "isdigit"};
ya no son funciones sino que las convertistes a un arreglo de caracteres #include<iostream> #include <ctype.h> using namespace std; int main(){ char ch; cout<<"Ingrese un caracter "<<endl; cin>>ch; if(islower(ch)) cout<<"Es minuscula"<<endl; else if(isupper(ch)) cout<<"Es mayuscula"<<endl; else if (isdigit(ch)) cout<<"Es un numero "<<endl; else cout<<"No es minisucula, mayusucula o numero"<<endl; cin.get(); cin.get(); return 0; }
mi version esta en c++ pero creo que se entiende saludos...
|
|
|
En línea
|
Si C/C++ es el padre de los lenguajes entonces ASM es dios.
|
|
|
DanielPy
Desconectado
Mensajes: 145
|
Hola crack81. Gracias por ocuparte, eso es precisamente lo que no quiero hacer, utilizar 100 if.- Acabo de ver una referencia con puntero a función, voy a practicar para intentar lograrlo, de cualquier manera seguramente vos u otro tendrán una manera de hacerlo sin usar if ni switch.-
Saludos. Daniel
|
|
|
En línea
|
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
|
|
|
crack81
Desconectado
Mensajes: 222
|
Bueno antes te doy las gracias porque este tema no lo conocia asi que me puse a investigar y creo que esta es la solucion que buscabas #include <iostream> #include <ctype.h> using namespace std; int (*func[])(int) = {islower,isupper,isdigit}; string mensaje[] = {"una letra minuscula", "una letra mayuscula", "un numero"}; int main() { char ch; cout<<"ingrese unc caracter "<<endl; cin>>ch; for(int i=0;i<3;i++){ if((*func[i])(ch)){ cout<<"ingreso "<<mensaje[i]<<endl; break; } } cin.get(); cin.get(); return 0; }
la verdad muy interesante el tema de punteros a funciones
|
|
« Última modificación: 29 Diciembre 2014, 22:19 pm por crack81 »
|
En línea
|
Si C/C++ es el padre de los lenguajes entonces ASM es dios.
|
|
|
DanielPy
Desconectado
Mensajes: 145
|
Hola. Es precisamente lo que quería lograr, sólo tengo el trabajo de pasarlo de c++ a c, no tengo conocimientos de c++ pero seguramente no debe ser cosa de otro mundo.- Otra cosita, a las 20.26 no tenías ni idea de “puntero a función” y a las 22.18 ya hiciste un programa, a mí me llevo más de 2 días el tema y por lo visto todavía me falta, te felicito.-
Saludos. Daniel
|
|
|
En línea
|
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
|
|
|
rir3760
Desconectado
Mensajes: 1.639
|
Es precisamente lo que quería lograr, sólo tengo el trabajo de pasarlo de c++ a c, no tengo conocimientos de c++ pero seguramente no debe ser cosa de otro mundo. La parte relacionada con el uso de punteros a función la puedes utilizar tal cual, sin cambios: /* ... */ if ((*func[i])(ch)){
Solo un detalle: la expresión "(*func[ i ])(ch)" es valida pero no es necesario el operador de indirección, se puede utilizar "func[ i ](ch)" sin problemas. Un saludo
|
|
|
En línea
|
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly. -- Kernighan & Ritchie, The C programming language
|
|
|
Yoel Alejandro
|
Bueno,..... estuve revisando y convertir de C++ a C encierra unos detalles no tan mínimos Debes cambiar los cout a printf, el cin a scanf. Ahora, como C no admite la clase string (C no admite clases), hay que declarar e inicializar el array de mensajes "manualmente". Puede quedar así: #include <stdio.h> #include <ctype.h> int (*func[])(int) = {islower,isupper,isdigit}; char *mensaje1 = "una letra minuscula"; char *mensaje2 = "una letra mayuscula"; char *mensaje3 = "un numero"; char *mensaje[3]; int main() { char ch; int i; /* inicializa los mensajes */ mensaje[0] = mensaje1; mensaje[1] = mensaje2; mensaje[2] = mensaje3; printf("ingrese un caracter: "); scanf ( "%c", &ch); while ( getchar() != '\n' ) ; /* limpiar el bufer de entrada */ for (i=0; i<3; i++) { if ((*func[i])(ch)) { printf( "ingreso %s\n", mensaje[i] ); break; } } //getchar(); /* pausa antes de salir */ return 0; }
|
|
|
En línea
|
Saludos, Yoel. P.D..- Para mayores dudas, puedes enviarme un mensaje personal (M.P.)
|
|
|
DanielPy
Desconectado
Mensajes: 145
|
Hola yoel_alejandro. Muchas gracias por ocuparte del paso del programa de c++ a c, funciona a la perfección.- Igual yo dejo mi versión.- #include <stdio.h> #include <string.h> #include <ctype.h> int main(int argc,char **argv){ char a,*mensaje[] = {"una letra minuscula", "una letra mayuscula", "un numero"}; int i; printf("\n Ingrese un caracter cualquiera [confirme con Enter]...:"); 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; }
Saludos. Daniel
|
|
« Última modificación: 3 Enero 2015, 23:25 pm por DanielC# »
|
En línea
|
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
|
|
|
Yoel Alejandro
|
Excelente por tu trabajo te felicito. Sólo un detalle. ¿Te has preguntado por qué requieres dos getchar() para hacer la pausa al final del programa? Con uno sólo no funciona La razón es que a = getchar();
descarta la tecla ENTER, y sólo almacena en la variable a el carácter introducido antes del mismo. Entonces dicho ENTER debe ser "limpiado", a eso llamamos limpiar el búfer de entrada. Usamos: while ( getchar() != '\n' ) ; /* limpiar el bufer de entrada */
y listo ya puedes poner un único getchar() al final del programa para producir la pausa. Es recomendable siempre "limpiar el búfer" tras un getchar(), un gets() o un scanf() pues estas funciones descartan el carácter de nueva línea.
|
|
|
En línea
|
Saludos, Yoel. P.D..- Para mayores dudas, puedes enviarme un mensaje personal (M.P.)
|
|
|
DanielPy
Desconectado
Mensajes: 145
|
Hola. Me vino de perillas tu aclaración, si bien ya tengo incorporado lo de limpiar el buffer de entrada (gracias pero muchas gracias a rir3760) que además valida que el ingreso sea sin errores, en este caso lo olvide e iba a hacer una validación porque al ingresar por ejemplo 4b el programa finalizaba abruptamente, con la limpieza del buffer ello no ocurre.-
Saludos. Daniel
|
|
|
En línea
|
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Array y bucle for
« 1 2 »
Java
|
Dem0ny
|
12
|
9,659
|
3 Enero 2010, 23:51 pm
por panaka
|
|
|
Array de punteros.
Programación C/C++
|
soyloqbuskas
|
3
|
9,756
|
30 Enero 2012, 20:28 pm
por soyloqbuskas
|
|
|
Duda Punteros Dobles/Array de punteros
Programación C/C++
|
MisterJava
|
2
|
5,206
|
30 Diciembre 2012, 20:19 pm
por MisterJava
|
|
|
Es posible llamar funciones en un bucle?
Programación C/C++
|
muymuyperdido
|
2
|
2,874
|
25 Diciembre 2012, 20:16 pm
por lucaslopez0000
|
|
|
Acceder a los caracteres de un array de punteros
Programación C/C++
|
David8
|
5
|
2,295
|
6 Mayo 2014, 12:24 pm
por eferion
|
|