elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Pasar de cadena(char) a entero(int) sin sobrepasar el máximo permitido.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 3 Ir Abajo Respuesta Imprimir
Autor Tema: Pasar de cadena(char) a entero(int) sin sobrepasar el máximo permitido.  (Leído 10,724 veces)
NOB2014


Desconectado Desconectado

Mensajes: 366



Ver Perfil
Pasar de cadena(char) a entero(int) sin sobrepasar el máximo permitido.
« en: 6 Enero 2014, 21:45 pm »

Hola.-
Les dejo un pequeño programa que luego voy a seguir completando, lo que quiero saber es si se puede antes de convertir la cadena a entero verificar si el número ingresado sobrepasa el máximo permitido por el tipo int.-

Código
  1. #include <stdio.h>
  2. #include <limits.h>
  3. #include <stdlib.h>
  4.  
  5. int main(){
  6. char numero[10] = "";
  7. int ok=0, i=0;
  8.  
  9. do{
  10. system("CLS");
  11. ok=0;
  12. printf("\n Introduce el numero que deseas convertir a binario\n maximo [%d]...:", INT_MAX);
  13. fgets(numero, 10, stdin);
  14. numero[strlen(numero)-1]='\0';
  15.  
  16. for(i=0;numero[i] != '\0'; i++){
  17. if(numero[i] <=47 || numero[i] >=58){
  18. ok=1;
  19. printf("\n Solo debe ingresar numeros, Pulse una tecla para intentarlo nuevamente..."); getchar();
  20. }
  21. }
  22. }while(ok == 1);
  23.  
  24. printf("\n %s", numero);
  25. return 0;
  26. }

Bueno es todo.-
Saludos.


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


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Pasar de cadena(char) a entero(int) sin sobrepasar el máximo permitido.
« Respuesta #1 en: 6 Enero 2014, 23:41 pm »

Los enteros (con signo) tiene el valor máximo de 2.147.483.648

Por lo que el algoritmo sería:

- Si el numero tiene mas de 10 cifras, entonces no cabe.
- Si el numero tiene menos de 10 cifras, entonces cabe.
- Si el número tiene 10 cifras y la primera cifra es 3 o más, entonces cabe.
- Transforma el número, si es negativo entonces no cabe.

Por cierto para quepa un entero el array de char debe ser de 11 caracteres al menos.


En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
NOB2014


Desconectado Desconectado

Mensajes: 366



Ver Perfil
Re: Pasar de cadena(char) a entero(int) sin sobrepasar el máximo permitido.
« Respuesta #2 en: 7 Enero 2014, 00:17 am »

Hola.-
Citar
Si el número tiene 10 cifras y la primera cifra es 3 o más, entonces cabe.
Me parece que deberia ser hací.-
Citar
Si el número tiene 10 cifras y la primera cifra es 3 o más, entonces NO cabe.
Bien la idea la capte, sólo que tengo 2 problemas.-
Qué pasa si el número ingresado es 2.247.483.648 tampoco cabe.-
La otra es que tengo que apretar Enter después de limpiar el buffer de teclado.-
Te aclaro que le hice otras validaciones.-

Código
  1. #include <stdio.h>
  2. #include <limits.h>
  3. #include <stdlib.h>
  4.  
  5. int main(){
  6. char numero[11] = "", ch=0;
  7. int ok=0, i=0;
  8.  
  9. do{
  10. system("CLS");
  11. ok=0;
  12. printf("\n Introduce el numero que deseas convertir a binario\n maximo [%d]...:", INT_MAX);
  13. fgets(numero, 10, stdin);
  14. numero[strlen(numero)-1]='\0';
  15. //while((ch = getchar()) != EOF && ch != '\n');
  16.  
  17. if(numero[0] == '0' || strlen(numero) == 0){
  18. ok=1;
  19. printf("\n Error, Pulse una tecla para intentarlo nuevamente..."); getchar();
  20. }
  21. else{
  22. for(i=0;numero[i] != '\0'; i++){
  23. if(numero[i] <=47 || numero[i] >=58){
  24. ok=1;
  25. printf("\n Solo debe ingresar numeros, Pulse una tecla para intentarlo nuevamente..."); getchar();
  26. }
  27. }
  28. }
  29. }while(ok == 1);
  30.  
  31.  
  32. printf("\n %s", numero);
  33. return 0;
  34. }
  35.  
Saludos
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 Desconectado

Mensajes: 1.639


Ver Perfil
Re: Pasar de cadena(char) a entero(int) sin sobrepasar el máximo permitido.
« Respuesta #3 en: 7 Enero 2014, 03:40 am »

lo que quiero saber es si se puede antes de convertir la cadena a entero verificar si el número ingresado sobrepasa el máximo permitido por el tipo int.
Para realizar esa operación puedes utilizar la función strtol (prototipo en <stdlib.h>), por ejemplo:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <limits.h>
  4. #include <errno.h>
  5. #include <ctype.h>
  6.  
  7. #define NUM_CHARS  256
  8.  
  9. int main(void)
  10. {
  11.   char cad[NUM_CHARS];
  12.   char *p;
  13.   long num;
  14.  
  15.   printf("Introduce un numero (%d .. %d): ", INT_MIN, INT_MAX);
  16.   fflush(stdout);
  17.   if (fgets(cad, NUM_CHARS, stdin) == NULL)
  18.      return EXIT_FAILURE;
  19.  
  20.   num = strtol(cad, &p, 10);
  21.  
  22.   if (num == 0 && p == cad)
  23.      puts("Entrada no valida");
  24.   else if (errno == ERANGE && (num == LONG_MAX || num == LONG_MIN))
  25.      puts("Numero fuera del rango valido para el tipo signed long");
  26.   else {
  27.      while (isspace(*p))
  28.         p++;
  29.  
  30.      if (*p != '\0')
  31.         puts("Caracteres invalidos al final de la cadena");
  32.      else
  33.         printf("El numero %ld es valido\n", num);
  34.   }
  35.  
  36.   return EXIT_SUCCESS;
  37. }
Solo falta agregar una validación (que el numero este en el rango INT_MIN .. INT_MAX).

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
blipi

Desconectado Desconectado

Mensajes: 25


Programador y hacker por devoción


Ver Perfil WWW
Re: Pasar de cadena(char) a entero(int) sin sobrepasar el máximo permitido.
« Respuesta #4 en: 7 Enero 2014, 03:49 am »

Si te quieres complicar aun menos, y suponiendo que no te importe usar C++, std::stoi es tu solución:

http://www.cplusplus.com/reference/string/stoi/

Con eso y un simple bloque try/catch, lo tienes solucionado.

Código
  1. try
  2. {
  3. std::string str(numero);
  4. std::string::size_type sz;
  5. int bytes = std::stoi(str, &sz);
  6. std::cout << "Bytes: " << bytes << std::endl;
  7. }
  8. catch(std::out_of_range&)
  9. {
  10. std::cout << "Fuera de limites!" << std::endl;
  11. }
  12. catch(std::invalid_argument&)
  13. {
  14. std::cout << "No es un numero!" << std::endl;
  15. }
  16.  

Solo te faltaría convertir a binario (por bytes, entendemos que es el numero tal cual)
« Última modificación: 7 Enero 2014, 03:51 am por blipi » En línea

NOB2014


Desconectado Desconectado

Mensajes: 366



Ver Perfil
Re: Pasar de cadena(char) a entero(int) sin sobrepasar el máximo permitido.
« Respuesta #5 en: 7 Enero 2014, 04:00 am »

Hola.
Por el momento estoy aprendiendo C y ya la respuesta de rir3760 me resulta un tanto difícil de interpretar pero lo voy a intentar.-

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


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Pasar de cadena(char) a entero(int) sin sobrepasar el máximo permitido.
« Respuesta #6 en: 7 Enero 2014, 10:14 am »

Como es mi costumbre, sin tratar de modificar en exceso el código que planteas, hago una simple comparación entre la variable num, convertida a long long int, con INT_MAX, suponiendo que lo que se trata es de un INT positivo, si no coméntalo.

¿Y por qué uso el tipo long long int?. Porque si uso el tipo INT para num, si introduzco un número de 10 cifras, pero mayor que INT_MAX por ser mayor a ese límite, tomaría un valor basura y la comparación no sería correcta. Simple pero efectivo. ;) ;) ;)


Código
  1. #include <stdio.h>
  2. #include <limits.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. int main(){
  6. char numero[101] = "";
  7. int ok=0, i=0,ch=0;
  8. long long int num=0;
  9. do{
  10. system("CLS");
  11. ok=0;
  12. printf("\n Introduce el n%cmero que deseas convertir a binario\n maximo [%d]...:",163, INT_MAX);
  13. fflush(stdout);
  14. scanf ("%101[^\n]s",numero);
  15. num = atoll (numero);
  16. while((ch = getchar()) != EOF && ch != '\n');
  17. for(i=0;numero[i]; i++){
  18. if((strlen (numero)>10) ){
  19. ok=1;
  20. printf("\nTe has pasado en n%cmero de cifras. \n",163);
  21. break;
  22. }
  23. else if((numero[i] <=47 || numero[i] >=58) ){
  24. ok=1;
  25. printf("\n Solo debes ingresar n%cmeros. \n",163);
  26. break;
  27. }
  28. else if((num> INT_MAX) ){
  29. ok=1;
  30. printf("\n Te has pasado en tama%co.\n",164);
  31. break;
  32. }
  33.      }
  34.    system ("pause");
  35. }while(ok == 1);
  36. printf("\n %s\n", numero);
  37. return 0;
  38. }
  39.  

Por cierto, los números que aparecen al final de los printf son los códigos ASCII par poder ver en pantalla la ñ y los acentos :rolleyes: :rolleyes: :rolleyes:.

¡¡¡¡ Saluditos! ..... !!!!


:rolleyes: ;) ;) ;) :rolleyes:

P.D:

...........................................
- Si el número tiene 10 cifras y la primera cifra es 3 o más, entonces cabe.
.....................................

Te despistaste, no cabe.

« Última modificación: 8 Enero 2014, 22:26 pm por leosansan » En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Pasar de cadena(char) a entero(int) sin sobrepasar el máximo permitido.
« Respuesta #7 en: 7 Enero 2014, 11:51 am »

Efectivamente, era no cabe

Qué pasa si el número ingresado es 2.247.483.648 tampoco cabe.-
Eso ya lo tengo verificado, mira el último punto.

Si es mayor de 2.247.483.648 pero menor que 3 mil millones, entonces al pasarlo a entero desbordará y se quedará negativo.
En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Pasar de cadena(char) a entero(int) sin sobrepasar el máximo permitido.
« Respuesta #8 en: 7 Enero 2014, 13:18 pm »

.......................................................................
Si es mayor de 2.247.483.648 pero menor que 3 mil millones, entonces al pasarlo a entero desbordará y se quedará negativo.

Me he levantado, muy de madrugada, y estoy "pijito". ;)

Esta vez te sobra en la frase lo de "pero menor que 3 mil millones". Es suficiente que sea mayor de 2.247.483.647, y digo bien mayor que no igual, para que se produzca desbordamiento.

Lo dicho, estoy "pijito". ;)

Un fuerte abrazo y que en este año, y los venideros, te sean favorables los hados.  :rolleyes: :rolleyes: :rolleyes:

¡¡¡¡ Saluditos! ..... !!!!

:rolleyes: ;) ;) ;) :rolleyes:

P.D. Por cierto, yo el código lo tengo bien indentado:


pero al hacer el pegado entre las etiquetas code no sé que pasa que los distorsiona. ¡¡¡Horror!!!,espero que no se trate de un mal augurio, lo que me faltaba.  :huh: :huh: :huh:
« Última modificación: 7 Enero 2014, 15:39 pm por leosansan » En línea

dato000


Desconectado Desconectado

Mensajes: 3.034



Ver Perfil
Re: Pasar de cadena(char) a entero(int) sin sobrepasar el máximo permitido.
« Respuesta #9 en: 7 Enero 2014, 13:31 pm »

Pues justamente llegue a un punto bastante parecido al del post, y estuve intentando lo de los acentos en C:

Código
  1. printf("\n Introduce el n%cmero que deseas convertir a binario\n maximo [%d]...:", 163, INT_MAX);

Una cosa, esta al reves, primero deberia ir la variable tipo ASCII (163 ---> ù) y luego la que contiene el valor máximo de una variable tipo entera (INT_MAX---> #define INT_MAX 0x7FFF/0x7FFFFFFF ---> 2.247.483.647)

Ahora, lo de los acentos, pues bueno. No me funciono...

Voy a trabajar un poco en este punto, ya me faltan pocos ejercicios para terminar el tema de punteros  :laugh: :laugh:
En línea


Páginas: [1] 2 3 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[C] pasar un entero a char*
Programación C/C++
KandiZickZad 1 6,022 Último mensaje 2 Mayo 2011, 08:01 am
por leogtz
Como pasar una cadena char a hexadecimal por argumento a un constant char?
Programación C/C++
ahaugas 3 5,631 Último mensaje 13 Enero 2013, 14:09 pm
por ahaugas
numero maximo permitido
Programación C/C++
m@o_614 5 3,576 Último mensaje 22 Febrero 2014, 23:32 pm
por vangodp
Pasar cadena String a una variable Char en C++
Programación C/C++
RGT 3 2,695 Último mensaje 6 Noviembre 2015, 16:19 pm
por class_OpenGL
[Aporte] No superar el máximo permitido por el tipo int. lenguaje C
Programación C/C++
NOB2014 1 2,109 Último mensaje 24 Agosto 2016, 02:21 am
por NOB2014
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines