Cadena de caracteres en C

Iniciado por Jurott1, 1 Mayo 2017, 02:28 AM

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

Jurott1

Buenas,

el problema que tengo es que necesito hacer una función que va a recibir una cadena de 50 caracteres pero solo debe aceptar números del 1 al 10, cualquier otra cadena ya sea un número más alto de 10, letras o una cadena vacía(que no se introduzca nada o con espacios) debe decir que da un error.

Empecé el programa y conseguí que leyese de 0 al 9 pero lo hice un poco rudimentario entonces el que utilicé no puedo modificarlo para leer dos cifras ya que me basé en leer y guardar la diferencia entre leer el principio y final de la cadena y colocar un if para que se acomodase entre el 0 y el 9, pero no me sirve para cifras doble(en este caso solo el 10). Alguna idea ?

CalgaryCorpus

Publica el trozo de codigo relevante, muestra como lo probaste, que es lo que no funciona y como quieres que funcione.
Aqui mi perfil en LinkedIn, invitame un cafe aqui

Jurott1

#2

#include <stdio.h>
#include <ctype.h>

int main(){
 int i=0,j=0,contador=0,resul;
 char respuesta[50],p;
 
 do{
   
 printf ("Introduzca un numero entre 0 y 10\n");
 fgets(respuesta,sizeof(respuesta),stdin);
 
 for(j=0;respuesta[i] != '\0'; j++){
   contador++;
   resul=contador;
 }
 } while(resul>50); */Deberia preguntar todo el rato por una cadena que tenga menos de 50 caracteres*/
   
*/Una vez que la cadena sea del tamanhoo correcto tenemos que ver que cumpla: ser un digito entre 0 y 10, si es otra cosa, ya sea otro numero, letras, blancos
o saltos de linea debe decir que es incorrecto , en estos casos debemos pedir otra vez una cadena*/
 for(i=0;respuesta[i] != '\0';i++){
   p=respuesta[i];

   if ((0<=p<=10 && isdigit(p))) {
     printf("bien\n");
     break;
   }

   if ((p<0 || p>10) && isdigit(p))
  printf ("mal\n");

   if(isalpha(p)){
     printf("incorrecto\n");
   break;
   }
       
 }
 return 0;
}

MAFUS

La comprobación que haces para comprobar si la respuesta es mayor de 50 caracteres no es necesaria pues fgets nunca te dejará introducir más caracteres que los que les marcas.

if((0<=p<=10 && isdigit(p))esto está mal pues los números se guardan en ASCII no literales, por tanto 0<=p<=10, además de ser una construcción lógica mal hecha en C no comprobará lo que buscas. Deberías usar funciones que comprobaran cadenas, como strcmp.

Jurott1

El problema es que necesito saber si la cadena introducida por el usuario es mayor de 50 caracteres para decirle que la longitud es excesiva y pedirle que la vuelva a introducir.

Si hiciese la comprobación primero de si es un número con:

if(isdigit(p)){
....
}


como haría para saber si ese número que me han dado es uno que esté entre el 0 y el 10 ?

CalgaryCorpus

Eso es lo que hace isdigit, es superfluo comprobarlo después.
Aqui mi perfil en LinkedIn, invitame un cafe aqui

NOB2014

#6
Hola, Jurott1.
¿Esto te puede servir?

#include <stdio.h>
#include <stdlib.h>

int main( int argc,char **argv ){
int ok, numero, ch;
do{
printf("\n Introduzca un numero entre 1 y 10 ...............:");
ok = scanf("%d",&numero) == 1 && numero >= 1 && numero <= 10;  
while ((ch = getchar()) != EOF && ch != '\n');
}while(!ok);

return EXIT_SUCCESS;
}


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

Jurott1

int entrenumeros(num1,num2){
int i=0,resp;
char respuesta[15];

do{
    printf("Introduzca un numero entre %i y %i:\n",num1, num2);
    fgets(respuesta,sizeof(respuesta),stdin);
   
    for(i=0; respuesta[i] != '\0'; i++){ //lee los caracteres de uno en uno.
   
        if (isdigit(respuesta[i])){ //Si es un digito lo pone en la variable resp
            resp=atoi(respuesta);
           
            if ((resp>=num1 && resp<=num2)){ //Si resp esta entre los dos numeros que nosotros ponemos como parametros es correcto y sale del for y del do-while, retornando el valor de resp al programa principal
               break;
               }
            if((resp<num1 || resp>num2)){ //Si el numero no esta entre los parametros muestra el mensaje
            printf("Has realizado una seleccion no valida\n");
            break;
            }
        }
       
        if (isalpha(respuesta[i])){ //si es un caracter muestra el mensaje
        printf("Has realizado una seleccion no valida\n");
        break;
        }
     }
} while (!(resp>=num1 && resp<=num2)); //Solo sale si el numero introducido se encuentra entre los parametros puestos por nosotros.

return resp;
}     


He hecho este codigo pero tengo un problema, ahora los parametros introducidos a la funcion los damos nosotros y el dato que el usuario nos de debe estar entre num1 y num2, el problema es cuando ponen una cadena del tipo "2ASKDASDL" que lee primero el 2 pero ignora el resto de la cadena (cosa que deberia dar error y mostrar mensaje de seleccion no valido).

MAFUS

De seguro que has pensado en la solución pero la has descartado por demasiado complicada. Algo así cómo:
CitarTengo que capturar una frase desde el teclado y debo mirar si todo son números. Si lo son tengo que ver si esos números están entre el máximo y mínimo que me da el usuario y si no dar un error.

El enunciado de la idea te da la solución.
1. Capturas la frase
2. Te mueves carácter por carácter para ver si es un dígito (ya has usado isdigit). Si todo son dígitos continuas con el punto 3, sino marcas error y sales.
3. Transformas la cadena a un número. Con sscanf (las dos eses no son un error) lo conseguirás.
4. Compruebas que están entre los límites.