AYUDA PROGRAMA EN C:No detecta los tipo Char

Iniciado por Dayleap, 6 Mayo 2016, 12:38 PM

0 Miembros y 1 Visitante están viendo este tema.

Dayleap

 ; esto forma parte de un programa mayor ; el porblema esta en que cuando lo ejecuto y le introduzco por teclado un valor tal que resp pasa a ser igual a ... por ejemplo '3f', es decir: resp[0]=3 resp[1]=f entonces me deberia de volver a pedir que escoja un nuevo nivel de dificultad pero no lo hace. Lo que hace es retornarme la parte entera del array y , si no tiene parte entera me devuelve un 0; LO QUE QUIERO QUE HAGA ES QUE SI INTRODUZCO UN CARACTER ME LO DETECTE Y ME DIGA QUE VUELVA A INTRODUCIR LA DIFICULTAD. MUCHAS GRACIAS  ;D
int main(){
int control=0,n,i,dif;
char resp[4];
printf("Nivel actual %i \n", dificultad);

do{
printf("Elige el nuevo nivel[1..100]: \n");
fflush(stdin);
scanf(" %s",  &resp);

n=strlen(resp);          //COMPROBACIONES
if(n<1||n>=4){control=1;}

for(i=0;i<n;i++){   //letras
if(resp[i]<'0'&& resp[i]>'9'){
control=2;}}
switch(control){
case 1:
printf("\nHas seleccionado un n\243mero no v\240lido\n\n");break;
case 2:
printf("El numero ha de contener solo digitos\n");break;
case 0:
dif=atoi(resp);
if(dif>=1&&dif<=100){
printf("\nHas establecido numero de intentos máximo como: %i \n\n", dif);control=0;}
else{printf("\nHas establecido un n\243mero no v\240lido\n\n");
control==1;
}
}
}while(control==3 || control==2 || control==1);
return 0;}

MAFUS

Bien, veo que lo has escrito deprisa y corriendo. Para otra vez formatea el código, se agradece verlo bien presentado.

Dentro del bucle do-while, pon la primera instrucción que lleve control a 0. Si hay algún fallo control empezará el bucle ya con código de error y no saldrás de él.

Para scanf, debes hacer que acepte un máximo de 4 caracteres, sino podrías crear desbordamiento de la variable resp. Sobre la variable resp, ella misma ya actúa como puntero y no debes pasarle la dirección de memoria.

No uses fflush(stdin) no es estándar y no va bien con todos los compiladores. Hay alternativas con funciones de librería y un poco de código.

resp<'0'&& resp>'9' puedes sustituirlo por la función de librería isdigit de ctype.h

En el 'case 0' has escrito, en su última instrucción control==1, una comparación sin efecto. Supongo que querías hacer una asignación.


HardForo

#2
Citarresp<'0'&& resp>'9' puedes sustituirlo por la función de librería isdigit de ctype.h

Vale la pena cargar una libreria para eso ?  si la libreria usa macros, claro que si  ::)

Por ejemplo la libreria stdlib.h para poder usar EXIT_SUCCESS y/o EXIT_FAILURE usa de hecho macros asi que no hay ningun tipo de overhead en el programa.

Respuesta inspirada en @MAFUS  ;D
HardForo:  foro de Hardware y programación

Se buscan Mods y colaboradores *

Dayleap

Muchas gracias , la funcion isdigit hacer que funcione  el codigo