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

 

 


Tema destacado: Como proteger una cartera - billetera de Bitcoin


  Mostrar Mensajes
Páginas: 1 ... 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 [155] 156 157 158 159 160
1541  Programación / Programación C/C++ / Re: [C]isNumeric (VB6 a C) en: 19 Agosto 2011, 17:55 pm
En el caso de C y si la intención es validar solo tipos enteros se puede utilizar la función strtol (prototipo en <stdlib.h>) dejando a esta la mayor parte del trabajo. Por ejemplo:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <ctype.h>
  4. #include <limits.h>
  5. #include <errno.h>
  6.  
  7. #define NUM_CHARS 256
  8.  
  9. int validar_int(char const *linea, int *num);
  10.  
  11. int main(void)
  12. {
  13.   char linea[NUM_CHARS];
  14.   int num;
  15.  
  16.   printf("Introduce un numero entero (signed int): ");
  17.   fflush(stdout);
  18.   if (fgets(linea, NUM_CHARS, stdin) == NULL)
  19.      return EXIT_FAILURE;
  20.  
  21.   if (validar_int(linea, &num))
  22.      printf("OK. El numero es %d\n", num);
  23.   else
  24.      puts("Error!");
  25.  
  26.   return EXIT_SUCCESS;
  27. }
  28.  
  29.  
  30. int validar_int(char const *linea, int *num)
  31. {
  32.   char *ch;
  33.   long res;
  34.  
  35.   /* Descartamos el ultimo error y tratamos de convertir la linea */
  36.   errno = 0;
  37.   res = strtol(linea, &ch, 0);
  38.  
  39.   /* A continuacion verificamos ... */
  40.  
  41.   /* ... si al menos un caracter pudo convertirse con exito */
  42.   if (res == 0 && ch == linea)
  43.      return 0;
  44.  
  45.   /* ... si el numero esta en el rango valido (signed long) */
  46.   if (errno == ERANGE && (res == LONG_MAX || res == LONG_MIN))
  47.      return 0;
  48.  
  49.   /* ... si el resto de la linea es espacio blanco */
  50.   while (isspace(*ch))
  51.      ch++;
  52.   if (*ch != '\0')
  53.      return 0;
  54.  
  55.   /* ... si el numero esta en el rango valido (signed int) */
  56.   if (res > INT_MAX || res < INT_MIN)
  57.      return 0;
  58.  
  59.   /* Si todo se cumple el numero introducido es valido */
  60.   *num = res;
  61.  
  62.   return 1;
  63. }

Para números de tipo flotante se puede tomar una aproximación similar utilizando strtod (prototipo tambien en <stdlib.h>).

Un saludo
1542  Programación / Programación C/C++ / Re: Problema al hacer una Agenda Telefonica en C++ en: 19 Agosto 2011, 17:39 pm
Así es muy difícil ayudarte salvo utilizando la bola de cristal o, mejor todavía, la mascara vudú y la gallina.

Publica el código fuente completo de tu programa y lo revisamos.

Un saludo
1543  Programación / Programación C/C++ / Re: matriz en: 19 Agosto 2011, 17:35 pm
Código anterior de Valkyr:
Código
  1. int n1, n2, i, j;
  2.  
  3. printf ("Ingrese el numero de columnas de la matriz:");
  4. scanf ("%d", &n1);
  5. printf ("Ingrese el numero de filas de la matriz:");
  6. scanf ("%d", &n2);
  7.  
  8. int matriz[n1][n2];
  9. //Leer numeros y almacenarlos en la matriz
  10. for (i = 0; i < n1; i++)
  11. {
  12.   for (j = 0; j < n2; j++) {
  13.      scanf ("%d", &matriz[i][j]);
  14.   }
  15. }
  16.  
  17. //Mostrarla por pantalla
  18. for (i = 0; i < n1; i++)
  19. {
  20.   for (j = 0; j < n2; j++) {
  21.      printf ("%d |", matriz[i][j]);
  22.   }
  23. }

El código que puse anteriormente es correcto (o al menos, eso creo porque he usado más C++ que C). Lo he compilado (completando el código ya que falta incluir la librería, declarar el método main y return 0) y ha compilado perfectamente. Lo he ejecutado y el resultado que ha mostrado es el correcto.
Si y No.

En el estándar de facto de C (ISO C90) y C++ solo se puede indicar el numero de elementos de un array mediante una constante entera mayor que cero.

En el caso del nuevo estándar de C (ISO C99) si es posible pero este no tiene, ni de lejos, el soporte que si tiene C90.

Un saludo
1544  Programación / Programación C/C++ / Re: Podeis ayudarme? en: 19 Agosto 2011, 17:25 pm
Cierto, ese programa solo calcula la suma de los valores inicial y final mas tres. También tendríamos que preguntarnos si no le estamos haciendo la tarea al OP (quien inicio el tema).

Para la operación basta con un bucle donde cada uno de los números se agregue a un acumulador, mas o menos así:
Código
  1. long total = 0;
  2. for (int i = inicio; i <= fin; i++)
  3.   total += i;
  4.  
  5. // ...

Un saludo
1545  Programación / Programación C/C++ / Re: Problema al hacer una Agenda Telefonica en C++ en: 19 Agosto 2011, 17:19 pm
En esas dos funciones tienes el mismo error que ya te indicaron (debes indicar el indice del elemento al cual quieres acceder).

Un saludo
1546  Programación / Programación C/C++ / Re: dudita con cadena en: 19 Agosto 2011, 05:39 am
Una forma ligeramente distinta es utilizando sprintf para generar el mensaje. También puedes revisar la documentación de "strftime" si necesitas imprimir una cadena tomando en consideración el año, mes, etc.

Un ejemplo de la primera forma es:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <windows.h>
  5.  
  6. int main(void)
  7. {
  8.   char mensaje[100 /* Por decir algo*/];
  9.   time_t a;
  10.   time_t b;
  11.   int i;
  12.  
  13.   time(&a);
  14.  
  15.   for (i = 0; i < 3; i++)
  16.      MessageBox(NULL, "Click aqui", "", MB_OK);
  17.  
  18.   time(&b);
  19.   sprintf(mensaje, "%d segundos", (int) difftime(b, a));
  20.   MessageBox(NULL, mensaje, "Felicidades duraste", MB_OK);
  21.  
  22.   return EXIT_SUCCESS;
  23. }

Y un ejemplo sencillo de la segunda (C estándar) es:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4.  
  5. #define LONG_CADENA 128
  6.  
  7. int main(void)
  8. {
  9.   time_t t1;
  10.   struct tm *t2;
  11.   char cadena[LONG_CADENA];
  12.  
  13.   /* 1) Obtener la fecha actual ('time_t') */
  14.   if ((t1 = time(NULL)) == (time_t) -1)
  15.      return EXIT_FAILURE;
  16.  
  17.   /* 2) Obtener la fecha actual ('struct tm *') */
  18.   t2 = localtime(&t1);
  19.  
  20.   /* Imprimir la fecha "manualmente" mediante printf */
  21.   printf("%d/", t2->tm_year + 1900);
  22.   printf("%02d/", t2->tm_mon + 1);
  23.   printf("%02d\n", t2->tm_mday);
  24.  
  25.   /* Construir la fecha mediante strftime */
  26.   strftime(cadena, LONG_CADENA, "%Y/%m/%d", t2);
  27.   printf("%s\n", cadena);
  28.  
  29.   return EXIT_SUCCESS;
  30. }

Un saludo
1547  Programación / Programación C/C++ / Re: Pregunta de principiante. en: 19 Agosto 2011, 05:22 am
La forma "políticamente correcta" es <N> ya que así las facilidades cortesía de ese encabezado se colocan en el nombre de espacios estándar "std", para acceder a ellos se utiliza el nombre compuesto "std::X", "std::Y", etc. o bien directivas "using" para incluir en el nombre de espacios global solo los nombres necesarios.

La forma <N.h> es equivalente a:
Código
  1. #include <N>
  2. using namespace::std;
Con la desventaja de que todos los nombres cortesía de la inclusión ahora están en el nombre de espacios global lo que abre la puerta al conflicto de nombres (y la razón de los nombres de espacios es justamente eso: evitarlos).

Un saludo
1548  Programación / Programación C/C++ / Re: Ayuda, por favor, con algo muy básico - Compilación en: 19 Agosto 2011, 04:59 am
No, no... Como bien dije, es una convención, es para que el código sea mas legible.
Sin duda que no va a dar error, pero bueno... A mi en su momento me lo dijeron y yo te lo trasmito a vos :P
Es mejor evitar nombres que inician con ese carácter ya que en C los nombres que inician con un guion bajo están reservados, eso significa que si ocurre un error (conflicto de nombres) con, por ejemplo, "__FILE__" o "__STDC__" la culpa es nuestra.

Un saludo
1549  Programación / Programación C/C++ / Re: Tengo una duda de como determinar los digitos de un número en: 19 Agosto 2011, 04:22 am
La solucion exacta depende, principalmente, de los requisitos de validacion del algoritmo.

Por ejemplo si se espera, de facto, que la entrada sea valida consistiendo de un numero sin signo y posiblemente con decimales basta con:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main (void)
  5. {
  6.   int ch;
  7.   int num_digitos;
  8.  
  9.   num_digitos = 0;
  10.   while ((ch = getchar()) >= '0' && ch <= '9' || ch == '.')
  11.      num_digitos++;
  12.  
  13.   printf("Numero de digitos: %d\n", num_digitos);
  14.  
  15.   return EXIT_SUCCESS;
  16. }

Pero si se requiere de una validacion mas solida lo mejor es crear una pequeña maquina de estado.

Un saludo
1550  Programación / Programación C/C++ / Re: [C] [source] Revertir Cadenas en: 19 Agosto 2011, 03:48 am
Bueno estoy comenzando a aprender a manejar C y he estado haciendo algunos códigos, así que aquí les dejo un pequeño código que hice para revertir el orden de una cadena.

Código
  1. char * Revertir(char *Cadena, int tam)
  2. {
  3.  
  4. int i;
  5. char *tmp;
  6.  
  7. tmp = (char*)malloc(tam);
  8.  
  9. for (i = tam - 1; i >= 0; i--)
  10. {
  11. tmp[(tam-1)-i] = Cadena[i];
  12. }
  13.  
  14. tmp[tam] = '\0';
  15.  
  16. return tmp;
  17. }

En la función tienes un error al reservar memoria para "tam" caracteres ya que falta espacio para un carácter (para el '\0'), aparte de eso no es necesaria la conversión explicita.

Con la corrección mas algunos cambios (todos ellos menores):
Código
  1. char *invertir(char const *cad, int num_chars)
  2. {
  3.   char *tmp;
  4.   int i;
  5.  
  6.   tmp = malloc(num_chars + 1);
  7.  
  8.   for (i = 0; i < num_chars; i++)
  9.      tmp[i] = cad[num_chars - 1 - i];
  10.   tmp[i] = '\0';
  11.  
  12.   return tmp;
  13. }


----


¿Y por qué no usar ANSI C?

Código:
char *strrev(char *s);
Esa función no es parte de la biblioteca estándar de C.


----


¿Y el porqué de esta macro tan innecesaria?

leete esto: macros

Seria mejor evita esa macro y en su lugar utilizar el tipo "char". Ello porque en C una cadena literal como "hola, mundo" es de tipo "array N of char". Aqui el problema es: si el tipo "char" es equivalente a "signed char" o "unsigned char" depende de la implementancion.

Un saludo
Páginas: 1 ... 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 [155] 156 157 158 159 160
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines