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

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


  Mostrar Mensajes
Páginas: 1 2 [3] 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ... 160
21  Programación / Programación C/C++ / Re: Escribir una linea arriba en: 1 Junio 2015, 17:33 pm
Con solo C estándar no es posible. En el caso de Linux puedes utilizar una biblioteca como ncurses, un tutorial sobre esta es NCURSES Programming HOWTO y ejemplos sobre el tema que comentas se encuentran en el capitulo 6: Output functions.

Un saludo
22  Programación / Programación C/C++ / Re: Copiar en archivo frases con varias líneas(renglones)[C] en: 1 Junio 2015, 17:10 pm
Sólo a titulo aclaratorio, no olvides que el archivo va a tener por ej. 50 frases distintas, tengo que implementar alguna manera para saber dónde comienza y termina una determinada frase.
Puedes colocar primero una linea cuyo único contenido sea el numero de lineas que componen la frase la cual viene a continuación, siguiendo tu ejemplo la información en el archivo se modificaría a:
Código:
4
Cada vez que emites
un juicio o una crítica,
Estás enviando algo que
terminará por volver a ti.
3
Abraza las cosas y personas malas como si fueran tu más preciada joya,
son tus más grandes maestros de paciencia sabiduría y amor
y cuando lo abrazas dejan de causar dolor.
...

La lectura del archivo seria, mas o menos, así:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define NOM_ARCHIVO  "Input.txt"
  5. #define MAX_CHARS  4096
  6.  
  7. int main(void)
  8. {
  9.   FILE *in;
  10.   char linea[MAX_CHARS];
  11.   unsigned num_lineas;
  12.   unsigned i;
  13.   int frase;
  14.  
  15.   if ((in = fopen(NOM_ARCHIVO, "r")) == NULL){
  16.      perror(NOM_ARCHIVO);
  17.      return EXIT_FAILURE;
  18.   }
  19.  
  20.   frase = 1;
  21.   while (fgets(linea, MAX_CHARS, in) != NULL && sscanf(linea, "%u", &num_lineas) == 1){
  22.      printf("Frase %d:\n", frase);
  23.  
  24.      for (i = 0; i < num_lineas && fgets(linea, MAX_CHARS, in) != NULL; i++)
  25.         printf("%s", linea);
  26.  
  27.      frase++;
  28.   }
  29.   fclose(in);
  30.  
  31.   return EXIT_SUCCESS;
  32. }

Un saludo
23  Programación / Programación C/C++ / Re: Pasar string a time. Número de días entre dos fechas en: 1 Junio 2015, 16:47 pm
El otro "truco" (la `%c` final) sirve para evitar que el usuario introduzca cadenas más largas de la cuenta; por ejemplo: "24 11 19900asd".
El especificador "%c" al igual que "%[]" no descartan el espacio blanco inicial, por ello una linea que consista de los tres numeros (validos) para la fecha seguida del avance de linea (lo usual) resultara en la función scanf retornando cuatro.

La aproximación mas sencilla (en este caso) es utilizar scanf para leer y validar los tres números, a continuación se utiliza un bucle con getchar para verificar que el resto solo sea espacio/tabulador/etc. seguidos del carácter '\n'.

O bien se puede utilizar solo scanf pero queda (en mi opinión) muy feo:
Código
  1. int leidos =
  2.   scanf("%2u%2u%4u", &fecha.tm_mday, &fecha.tm_mon, &fecha.tm_year) == 3
  3.   && (scanf("%*[ \t]"), scanf("%1[\n]", &truco) == 1)
  4. ;

Un saludo
24  Programación / Programación C/C++ / Re: [AYUDA] Busqueda de comparacion de cadenas con arreglo de estructuras en: 13 Mayo 2015, 05:56 am
no se porque siempre me imprime la primera posición del arreglo de estructuras de las personas
Porque:

* La función strcmp retorna un valor diferente de cero si las cadenas son distintas, solo retornara cero si son iguales.

+

* El bucle donde se realiza la búsqueda solo se ejecutara una vez ya que en ambas ramas de la sentencia condicional if terminas el bucle con la sentencia "break":
Código
  1. for (i = 0; i < 10; i++) {
  2.   if (strcmp (nombreBusqueda, arregloPersonas[i].nombre)) {
  3.      /* ... */
  4.  
  5.      break; /* Terminar el bucle si se cumple la condicion del if ... */
  6.   }else {
  7.      /* ... */
  8.  
  9.      break; /* ... y si no se cumple ... tambien */
  10.   }
  11.  
  12.   //posicionBusqueda++;
  13. }

+

* En la primera iteración del bucle se compara la palabra introducida por el usuario y leída con:
Código
  1. printf ("Escriba el nombre de la persona que busca:  "), /* mejor ';' */
  2. scanf ("%s", nombreBusqueda);
Con el campo "nombre" del primer elemento del array el cual consiste de dos palabras:
Código
  1. PERSONA arregloPersonas[10] = {  { "manu chao", 50}, /* ... */
En buen cristiano no hay forma de que la palabra introducida por el usuario sea igual a esas dos palabras.

Para solucionarlo debes leer la entrada del usuario con fgets (asegurate de eliminar el resto de la linea anterior) y utilizar un bucle sin cuerpo mas o menos así:
Código
  1. for (i = 0; i < 10 && strcmp(nombreBusqueda, arregloPersonas[i].nombre); i++)
  2.   ;
  3. if (i != 10 /* Hay que evitar magic numbers, mejor una macro*/)
  4.   puts("Nombre encontrado!");
  5. else
  6.   puts("El nombre no se encuentra en la base de datos");

Un saludo
25  Programación / Programación C/C++ / Re: Pasar estructura a archivo distinto del que contiene la función main[C] en: 12 Mayo 2015, 03:22 am
Estoy aprendiendo a modular código en c y en el código que les dejo a continuación me da el siguiente error. Error: nombre de tipo desconocido ‘Fecha’, en las líneas 3:14 y 3:28.-
El error se genera porque el uso (1) del tipo "Fecha" aparece antes que su declaración (2):
Código
  1. #include <stdio.h>
  2. #include <windows.h>
  3. #include <time.h>
  4. #include "fechaDifDias.c" /* (1) Uso del tipo Fecha */
  5.  
  6. #define MENSAJE printf( "\n\n Pulse [Enter] para continuar..." ); getchar();
  7.  
  8. typedef struct{
  9. int orden;
  10. char b;
  11. char fecha[11];
  12. float verduras;
  13. float almacen;
  14. char nota[101];
  15. }Super;
  16.  
  17. typedef struct{
  18. int dia;
  19. int mes;
  20. int año;
  21. }Fecha;  /* (2) Declaracion del tipo Fecha */
Para solucionarlo basta con cambiar el orden: primero la declaración y después su uso.

Con todo no se recomienda incluir mediante directiva del preprocesador una unidad (extensión ".c") ya que pueden generarse otros errores como la definición múltiple de una función. Hay algunos temas sobre programación modular en la base de datos de los foros, los puedes consultar mediante el motor de búsqueda.

Un saludo
26  Programación / Programación C/C++ / Re: [Ayuda] Problema con cadenas de caracteres en: 11 Mayo 2015, 15:57 pm
una cadena de caracteres almacenada en una tabla de caracteres me esta dando problemas.
En el primer fragmento el error se encuentra en el bucle donde obtienes la procedencia del paquete:
Código
  1. char tipo[TIPO];
  2.  
  3. /* ... */
  4.  
  5. for (i = 0, c = 0; i <= TIPO; c++,i++)
  6.   tipo[c] = cad[i];
Ello porque el array "tipo" consiste de "TIPO" elementos y a ellos accedes mediante los indices 0 .. TIPO-1, si deseas almacenar ahí una cadena debes reservar el ultimo carácter para el '\0' con lo que los indices validos se reducen a 0 .. TIPO-2 pero en el bucle se copian los caracteres con indices 0 .. TIPO (un carácter de mas y no se agrega el '\0').

Para solucionarlo hay varias opciones, una es cambiar el bucle a:
Código
  1. for (i = 0; i < TIPO - 1; i++)
  2.   tipo[i] = cad[i];
  3. tipo[i] = '\0';
Otra es sustituir el bucle por una llamada a sprintf:
Código
  1. sprintf(tipo, "%.*s", TIPO - 1, cad);

Un saludo
27  Programación / Programación C/C++ / Re: ayuda repeticion en: 9 Mayo 2015, 18:28 pm
Porque estas utilizando el operador OR cuando deberías utilizar AND. Cambia el bucle a:
Código
  1. do {
  2.   printf("introduce ficha jug 1  x o o: ");
  3.   fflush(stdout);
  4.   scanf(" %c", &jug1);
  5. }while (jug1 != fichaX && jug1 != fichaC);

Un saludo
28  Programación / Programación C/C++ / Re: Tamaño de pantalla en: 9 Mayo 2015, 18:22 pm
mi pregunta o duda es cómo hacer que la pantalla o la consola se muestre en pantalla completa?, habrá alguna función que lo implemente?
En el caso de MS Windows puedes utilizar la función SetConsoleDisplayMode.

Un saludo
29  Programación / Programación C/C++ / Re: ayuda repeticion en: 9 Mayo 2015, 17:46 pm
El problema se debe a que el especificador "%c" se traga (procesa) el primer carácter que se encuentre en la entrada estándar sin importar cual sea este. Si tu tecleas:
Código:
x{ENTER}
Ahí tienes dos caracteres ('x' y '\n') los cuales generan el comportamiento que mencionas.

Para solucionarlo, esto es, descartar el espacio blanco inicial de forma similar a los otros especificadores como "%d", "%s", etc. basta con utilizar " %c" (un espacio antes de caracter '%').

Un saludo
30  Programación / Programación C/C++ / Re: Problema con la hora (lenguaje C) en: 9 Mayo 2015, 17:30 pm
Ahora el unico problema que tengo es el siguiente, por ejemplo:

int dia, mes, año, hora, minuto;
char fecha [10]  = "04/05/2015:11:15";

Como hago para guardar el día, mes, año, hora y minutos en las variables tipo int declaradas?
La funcion atoi no me valdria porque al llegar a la ' / ' daria error.
En tu ejemplo no debes indicar el numero de elementos del array "fecha" ya que la literal "04/05/2015:11:15" tiene un tamaño mayor.

Para extraer los valores de la cadena puedes utilizar sscanf, un ejemplo basado en el tuyo es:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4.  
  5. int main(void)
  6. {
  7.   char fecha []  = "04/05/2015:11:15";
  8.   struct tm d;
  9.   int rv;
  10.  
  11.   rv = sscanf(fecha, "%d/%d/%d:%d:%d",
  12.      &d.tm_mday, &d.tm_mon, &d.tm_year, &d.tm_min, &d.tm_sec);
  13.  
  14.   if (rv == 5)
  15.      printf("%04d/%02d/%02d\n", d.tm_year, d.tm_mon, d.tm_mday);
  16.  
  17.   return EXIT_SUCCESS;
  18. }

Un saludo
Páginas: 1 2 [3] 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ... 160
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines