Autor
|
Tema: Cadena de caracteres en C (Leído 3,346 veces)
|
Jurott1
Desconectado
Mensajes: 4
|
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 ?
|
|
|
En línea
|
|
|
|
CalgaryCorpus
|
Publica el trozo de codigo relevante, muestra como lo probaste, que es lo que no funciona y como quieres que funcione.
|
|
|
En línea
|
|
|
|
Jurott1
Desconectado
Mensajes: 4
|
#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]; break; } break; } } return 0; }
|
|
« Última modificación: 1 Mayo 2017, 16:41 pm por Jurott1 »
|
En línea
|
|
|
|
MAFUS
Desconectado
Mensajes: 1.603
|
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.
|
|
|
En línea
|
|
|
|
Jurott1
Desconectado
Mensajes: 4
|
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: .... }
como haría para saber si ese número que me han dado es uno que esté entre el 0 y el 10 ?
|
|
|
En línea
|
|
|
|
CalgaryCorpus
|
Eso es lo que hace isdigit, es superfluo comprobarlo después.
|
|
|
En línea
|
|
|
|
NOB2014
Desconectado
Mensajes: 366
|
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.
|
|
« Última modificación: 1 Mayo 2017, 20:49 pm por NOB2014 »
|
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.-
|
|
|
Jurott1
Desconectado
Mensajes: 4
|
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 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).
|
|
|
En línea
|
|
|
|
MAFUS
Desconectado
Mensajes: 1.603
|
De seguro que has pensado en la solución pero la has descartado por demasiado complicada. Algo así cómo: 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.
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
cadena de caracteres
Programación C/C++
|
Ander123
|
1
|
2,590
|
6 Septiembre 2012, 14:15 pm
por avesudra
|
|
|
cadena de caracteres
Programación C/C++
|
brayan
|
5
|
2,848
|
27 Abril 2017, 18:41 pm
por Fedex15
|
|
|
Cadena aleatoria de caracteres
Java
|
DaniSM98
|
4
|
4,357
|
21 Enero 2018, 08:22 am
por rub'n
|
|
|
MOVIDO: Cadena aleatoria de caracteres
Programación General
|
Eleкtro
|
0
|
2,266
|
15 Enero 2018, 09:56 am
por Eleкtro
|
|
|
Cargar archivo binario(No lee los caracteres de la cadena)
Programación C/C++
|
arturo2507
|
1
|
1,537
|
24 Noviembre 2018, 00:28 am
por AlbertoBSD
|
|