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

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


  Mostrar Mensajes
Páginas: 1 ... 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 [46] 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 ... 160
451  Programación / Programación C/C++ / Re: Problema con loop en: 2 Marzo 2014, 16:59 pm
Soy nuevo con los arrays, y no entiendo cuando te referís a un array de arrays de carácteres, me darías un ejemplo?
1) Cuando se manejan valores del mismo tipo en lugar de un montón de variables se utiliza un array, por ejemplo:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define NUM_ELEM 10
  5.  
  6. int main(void)
  7. {
  8.   int num[NUM_ELEM]; /* array de int */
  9.   int i;
  10.  
  11.   for (i = 0; i < NUM_ELEM; i++){
  12.      num[i] = i;
  13.      printf("%d\n", num[i]);
  14.   }
  15.  
  16.   return EXIT_SUCCESS;
  17. }

2) En C una cadena se almacena en un array de caracteres. Por ejemplo:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(void)
  5. {
  6.   char palabra[] = "Jeremias"; /* array de caracteres */
  7.  
  8.   printf("%s\n", palabra);
  9.  
  10.   return EXIT_SUCCESS;
  11. }

Combinando los puntos anteriores si tu programa debe procesar varias cadenas estas se almacenan en un array de cadenas y como las cadenas se almacenan en arrays de caracteres eso resulta en un array de arrays de caracteres:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(void)
  5. {
  6.   char pal[][5] = {
  7.      "Hugo",
  8.      "Paco",
  9.      "Luis"
  10.   };
  11.   int num_pals = (int) (sizeof pal / sizeof pal[0]);
  12.   int i;
  13.  
  14.   for (i = 0; i < num_pals; i++)
  15.      printf("%s\n", pal[i]);
  16.  
  17.   return EXIT_SUCCESS;
  18. }

El uso de sizeof lo veras mas adelante, esta ahí porque lo políticamente correcto es no indicar el numero de elementos de un array si se utiliza (como en el ejemplo) una lista de valores para inicializarlo.

Un saludo
452  Programación / Programación C/C++ / Re: Problema con loop en: 1 Marzo 2014, 22:52 pm
Errores importantes hay dos:

* El primero como ya te comentaron esta en el bucle: no le das un valor inicial a la variable "j", la variable "x" sobra, la condición del bucle debe ser "j < i" y tienes un punto y coma demás justo antes del cuerpo del bucle.

* El segundo es utilizar un array de chars para almacenar las palabras cuando deberia ser un array de arrays de caracteres.

Otro detalle es utilizar un array de longitud variable ya que estos se soportan en C99 y son opcionales en C11. Para el caso puedes reservar memoria con malloc.

El programa con las correcciones:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define NUM_CHARS  128
  5.  
  6. int main(void)
  7. {
  8.   char (*palabra)[NUM_CHARS];
  9.   int num_pals;
  10.   int i;
  11.  
  12.   puts("Numero de productos:");
  13.   if (scanf("%d", &num_pals) != 1)
  14.      return EXIT_FAILURE;
  15.  
  16.   palabra = malloc(num_pals * sizeof *palabra);
  17.  
  18.   for (i = 0; i < num_pals; i++){
  19.      printf("Nombre del producto no %d:\n", i + 1);
  20.      scanf("%s", palabra[i]);
  21.   }
  22.  
  23.   /* ... */
  24.  
  25.   free(palabra);
  26.   return 0;
  27. }

Por ultimo hay que evitar el uso de scanf con "%s" ya que tiene los mismos riesgos que gets (mejor utilizar fgets).

Un saludo
453  Programación / Programación C/C++ / Re: C / C++ bit by bit --- exe to text y text to exe en: 1 Marzo 2014, 14:58 pm
Debes cambiar la condicion del if:
Código
  1. if (pFile==NULL && newFile==NULL)
  2.   perror ("Error opening file");
Ya que el mensaje de error solo se presentara si la apertura de ambos archivos falla (se debe sustituir "&&" por "||").

Y si piensas leer caracter por caracter puedes utilizar las funciones fgetc y fputc. Por ejemplo:
Código
  1. #include <stdio.h>
  2.  
  3. int main(void)
  4. {
  5.   FILE * pFile;
  6.   FILE * newFile;
  7.   int ch;
  8.  
  9.   if ((pFile = fopen("Hola.exe", "rb")) == NULL)
  10.      perror("Hola.exe");
  11.   else if ((newFile = fopen("EXE.exe", "wb")) == NULL)
  12.      perror("EXE.exe");
  13.   else
  14.      while ((ch = fgetc(pFile)) != EOF)
  15.         fputc(ch, newFile);
  16.  
  17.   if (pFile != NULL)
  18.      fclose(pFile);
  19.   if (newFile != NULL)
  20.      fclose(newFile);
  21.  
  22.   return 0;
  23. }

Sin embargo el programa lo unico que hace es una copia del archivo original, para el caso mejor utiliza una funcion cortesia del SO (en MS Windows puedes utilizar CopyFile y CopyFileEx).

Un saludo
454  Programación / Programación C/C++ / Re: Bug en String.h y getline( Eternal Idol, Littlehorse alguien)que opinan? en: 1 Marzo 2014, 14:23 pm
Una pregunta cstrng es para usar printf y/o scanf en cpp ¿no?
No. Antes de utilizar esas dos funciones debes incluir <cstdio>.

¿O también sirve para cout?
Para utilizar cin, cout y cerr primero debes incluir <iostream>.

Un saludo
455  Programación / Programación C/C++ / Re: C / C++ bit by bit --- exe to text y text to exe en: 1 Marzo 2014, 02:55 am
1.  Hola bueno lo que necesito es simple, Quiero tomar un fichero binario y transformarlo en texto... luego cuando tengo el texto quiero transformarlo a exe.
Como ya te comentaron un archivo es una secuencia de bytes, imprimir el valor de cada uno literalmente (65, 97, etc. en base 10 o cualquier otra base) o como un carácter de algún juego de caracteres (por ejemplo en ASCII A, a, etc.) es cuestión del usuario.


2.  Quisiera saber también como leer este fichero en Binario.
En el caso de C basta con abrir el archivo en modo binario "rb" y leer los caracteres con funciónes como fread, fgetc, etc. pero no estoy seguro si eso es lo que buscas.

Con todo un ejemplo sencillo (un "poor man's hex viewer") en C:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <ctype.h>
  4.  
  5. #define NOM_ACHIVO  "main.exe"
  6. #define NUM_COLS  16
  7.  
  8. int main(void)
  9. {
  10.   FILE *in;
  11.   unsigned char ch[NUM_COLS];
  12.   size_t nc;
  13.   size_t i;
  14.  
  15.   if ((in = fopen(NOM_ACHIVO, "rb")) == NULL){
  16.      perror(NOM_ACHIVO);
  17.      return EXIT_FAILURE;
  18.   }
  19.  
  20.   while ((nc = fread(ch, 1, NUM_COLS, in)) != 0){
  21.      for (i = 0; i < NUM_COLS; i++)
  22.         if (i < nc)
  23.            printf(" %02x", ch[i]);
  24.         else
  25.            printf("   ");
  26.  
  27.      printf("  |  ");
  28.  
  29.      for (i = 0; i < nc; i++)
  30.         if (ispunct(ch[i]) || isalnum(ch[i]))
  31.            putchar(ch[i]);
  32.         else
  33.            putchar(' ');
  34.  
  35.      printf("  |\n");
  36.   }
  37.   fclose(in);
  38.  
  39.   return EXIT_SUCCESS;
  40. }
La idea es imprimir valores hexadecimales (lo usual) y también como texto (cuando sea posible).

Un saludo
456  Programación / Programación C/C++ / Re: Bug en String.h y getline( Eternal Idol, Littlehorse alguien)que opinan? en: 1 Marzo 2014, 01:51 am
#include <string>Eso es una cosa que no sabia usaba stdio.h
En C para utilizar las funciones de entrada/salida (printf, scanf, etc.) primero se debe incluir el encabezado <stdio.h> (<cstdio> en C++), en el caso de las funciones para el manejo de cadenas y memoria (str___ y mem___) el encabezado a incluir es <string.h> (<cstring> en C++).

Un listado de las bibliotecas estándar de C y C++ (C99 y C++98) es Dinkumware Manuals

Un saludo
457  Programación / Programación C/C++ / Re: como regreso mas de un variable de una funcion con un apuntador?? en: 1 Marzo 2014, 01:38 am
Osea que la función estaba mal o free hace otra cosa aparte de liberar la memoria
La función esta mal, lo correcto es:
Código
  1. int *func()
  2. {
  3.   int *to_return = (int *) malloc(2 * sizeof(int));
  4.  
  5.   to_return[0] = 1;
  6.   to_return[1] = 2;
  7.  
  8.   return to_return;
  9. }

Un saludo
458  Programación / Programación C/C++ / Re: como regreso mas de un variable de una funcion con un apuntador?? en: 28 Febrero 2014, 14:23 pm
Como funciona este codigo:
Código
  1. int* func( )
  2. {
  3.  int* to_return = (int*)malloc( 2 * sizeof( int ) );
  4.  
  5.  to_return[ 0 ] = 1;
  6.  to_return[ 1 ] = 2;
  7.  
  8.  free( to_return );
  9. }

ya que nunca devuelve. Creo que free no devuelve o si?
Correcto, el tipo de retorno de la función free es void, para solucionarlo solo tienes que sustituir la sentencia "free( to_return );" por "return to_return;".

Un saludo
459  Programación / Programación C/C++ / Re: [C] Problema con ejercicio en: 27 Febrero 2014, 15:37 pm
No creo que sea buena idea incitar a la gente que está empezando a programar a usar bucles sin condición de los que se saldrá mediante breaks, no es una buena práctica.

Yo te animo a que intentes hacer un bucle con condición y te olvides del break.
Mas que una mala practica es una cuestión de estilos.

Una opción es utilizar un bucle con una salida al medio con la ventaja del mínimo de expresiones:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(void)
  5. {
  6.   int num;
  7.   int rv;
  8.   int ch;
  9.  
  10.   while (1){
  11.      printf("Introduce un numero (1 .. 9): ");
  12.      fflush(stdout);
  13.      if ((rv = scanf("%d", &num)) == EOF)
  14.         return EXIT_FAILURE;
  15.      else
  16.         while ((ch = getchar()) != EOF && ch != '\n')
  17.            ;
  18.  
  19.      if (rv == 1 && num >= 1 && num <= 9)
  20.         break;
  21.  
  22.      puts("Entrada no valida");
  23.   }
  24.  
  25.   printf("Numero: %d\n", num);
  26.  
  27.   return EXIT_SUCCESS;
  28. }

Otra es un bucle "while ..." o "do ... while" con expresiones repetidas:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(void)
  5. {
  6.   int num;
  7.   int rv;
  8.   int ch;
  9.   int ok;
  10.  
  11.   do {
  12.      printf("Introduce un numero (1 .. 9): ");
  13.      fflush(stdout);
  14.      if ((rv = scanf("%d", &num)) == EOF)
  15.         return EXIT_FAILURE;
  16.      else
  17.         while ((ch = getchar()) != EOF && ch != '\n')
  18.            ;
  19.  
  20.      ok = rv == 1 && num >= 1 && num <= 9;
  21.      if (!ok)
  22.         puts("Entrada no valida");
  23.   }while (!ok);
  24.  
  25.   printf("Numero: %d\n", num);
  26.  
  27.   return EXIT_SUCCESS;
  28. }

Una tercera es colocar toda la operación (en este caso lectura) en una función, mas o menos así:
Código
  1. while ((rv = fn(...)) == 0){
  2.   /* Entrada no valida o fuera de rango */
  3. }
  4. if (rv == EOF){
  5.   /* Error critico */
  6. }
  7.  
  8. /* ... (OK) */

----

P.D: Juraito, juraito que el código está bien indentado, pero no sé que pasa últimamente que al ponerlo en las Code se "desparrama".
Eso se debe a que en tu editor de texto estas indentando el código fuente con tabuladores en vez de espacios.

Un saludo
460  Programación / Programación C/C++ / Re: [C] Problema con ejercicio en: 25 Febrero 2014, 01:27 am
Sin esta linea, como comento en el comentario de arriba, el resultado a veces no es correcto
Código
  1. a2 = b2 = c2 = d2 = e2 = 0;
Eso sucede porque si no se inicializa una variable local su valor inicial es no definido o basura.

Con las variables a1, b1, etc. no hay problema porque lo primero que haces con ellas es asignarles un valor, por ejemplo:
Código
  1. case 1:
  2.   a1 = a * n;

Pero con las variables a2, b2, etc. lo primero que haces con ellas es utilizar su valor, por ejemplo:
Código
  1. case 1:
  2.   a1 = a * n;
  3.   a2 += a1; /* a2 = a2 + a1 == ALGUN_VALOR + a1 */

Y deberías sustituir esos dos grupos de variable (X1 y X2) por arrays, con ello el programa es mas fácil de desarrollar y mas corto.

Un saludo
Páginas: 1 ... 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 [46] 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 ... 160
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines