Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Jurott1 en 1 Mayo 2017, 02:28 am



Título: Cadena de caracteres en C
Publicado por: Jurott1 en 1 Mayo 2017, 02:28 am
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 ?


Título: Re: Cadena de caracteres en C
Publicado por: CalgaryCorpus en 1 Mayo 2017, 15:33 pm
Publica el trozo de codigo relevante, muestra como lo probaste, que es lo que no funciona y como quieres que funcione.


Título: Re: Cadena de caracteres en C
Publicado por: Jurott1 en 1 Mayo 2017, 16:33 pm
Código
  1. #include <stdio.h>
  2. #include <ctype.h>
  3.  
  4. int main(){
  5.  int i=0,j=0,contador=0,resul;
  6.  char respuesta[50],p;
  7.  
  8.  do{
  9.  
  10.  printf ("Introduzca un numero entre 0 y 10\n");
  11.  fgets(respuesta,sizeof(respuesta),stdin);
  12.  
  13.  for(j=0;respuesta[i] != '\0'; j++){
  14.    contador++;
  15.    resul=contador;
  16.  }
  17.  } while(resul>50); */Deberia preguntar todo el rato por una cadena que tenga menos de 50 caracteres*/
  18.  
  19. */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
  20. o saltos de linea debe decir que es incorrecto , en estos casos debemos pedir otra vez una cadena*/
  21.  for(i=0;respuesta[i] != '\0';i++){
  22.    p=respuesta[i];
  23.  
  24.    if ((0<=p<=10 && isdigit(p))) {
  25.      printf("bien\n");
  26.      break;
  27.    }
  28.  
  29.    if ((p<0 || p>10) && isdigit(p))
  30.   printf ("mal\n");
  31.  
  32.    if(isalpha(p)){
  33.      printf("incorrecto\n");
  34.    break;
  35.    }
  36.  
  37.  }
  38.  return 0;
  39. }
  40.  


Título: Re: Cadena de caracteres en C
Publicado por: MAFUS en 1 Mayo 2017, 17:19 pm
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.

Código:
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.


Título: Re: Cadena de caracteres en C
Publicado por: Jurott1 en 1 Mayo 2017, 18:41 pm
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:
Código
  1. if(isdigit(p)){
  2. ....
  3. }

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


Título: Re: Cadena de caracteres en C
Publicado por: CalgaryCorpus en 1 Mayo 2017, 18:54 pm
Eso es lo que hace isdigit, es superfluo comprobarlo después.


Título: Re: Cadena de caracteres en C
Publicado por: NOB2014 en 1 Mayo 2017, 19:19 pm
Hola, Jurott1.
¿Esto te puede servir?

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main( int argc,char **argv ){
  5. int ok, numero, ch;
  6. do{
  7. printf("\n Introduzca un numero entre 1 y 10 ...............:");
  8. ok = scanf("%d",&numero) == 1 && numero >= 1 && numero <= 10;  
  9. while ((ch = getchar()) != EOF && ch != '\n');
  10. }while(!ok);
  11.  
  12. return EXIT_SUCCESS;
  13. }

Saludos.


Título: Re: Cadena de caracteres en C
Publicado por: Jurott1 en 1 Mayo 2017, 23:37 pm
Código
  1. int entrenumeros(num1,num2){
  2. int i=0,resp;
  3. char respuesta[15];
  4.  
  5. do{
  6.    printf("Introduzca un numero entre %i y %i:\n",num1, num2);
  7.    fgets(respuesta,sizeof(respuesta),stdin);
  8.  
  9.    for(i=0; respuesta[i] != '\0'; i++){ //lee los caracteres de uno en uno.
  10.  
  11.        if (isdigit(respuesta[i])){ //Si es un digito lo pone en la variable resp
  12.            resp=atoi(respuesta);
  13.  
  14.            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
  15.               break;
  16.               }
  17.            if((resp<num1 || resp>num2)){ //Si el numero no esta entre los parametros muestra el mensaje
  18.            printf("Has realizado una seleccion no valida\n");
  19.            break;
  20.            }
  21.        }
  22.  
  23.        if (isalpha(respuesta[i])){ //si es un caracter muestra el mensaje
  24.        printf("Has realizado una seleccion no valida\n");
  25.        break;
  26.        }
  27.     }
  28. } while (!(resp>=num1 && resp<=num2)); //Solo sale si el numero introducido se encuentra entre los parametros puestos por nosotros.
  29.  
  30. return resp;
  31. }      

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


Título: Re: Cadena de caracteres en C
Publicado por: MAFUS en 2 Mayo 2017, 01:33 am
De seguro que has pensado en la solución pero la has descartado por demasiado complicada. Algo así cómo:
Citar
Tengo 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.