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)


  Mostrar Mensajes
Páginas: 1 ... 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 [142] 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 ... 161
1411  Programación / Programación C/C++ / Re: Duda sobre programa en C con STRINGS en: 8 Marzo 2016, 22:17 pm
Entiendo.
Hoy mismo ha habido una consulta en el foro con tu mismo problema.
Y repito:
fflush(stdin); no sirve para todos los compiladores, el estándar no define un comportamiento; por tanto solo se debe usar fflush para streams de salida.

Después de un scanf queda el caracter '\n' en el buffer del teclado que será recogido en la próxima lectura. Para evitarlo usar la instrucción
Código
  1. while(getchar() != '\n');
justo después de la instrucción scanf.
1412  Programación / Programación C/C++ / Re: Duda sobre programa en C con STRINGS en: 8 Marzo 2016, 20:58 pm
En alta(), auxiliar es una variable local y cuando se salga del ámbito de la función la información contenida va a desaparecer.

De todas formas deberías guardarlo en nombre de una variable de tipo struct dato. Recuerda que para hacer eso primero debes asignar espacio en la memoria con malloc o calloc para el puntero a char nombre. De igual forma deberás tener en cuenta que la memoria que dejes de usar de un tipo dato tendrás que liberar el puntero nombre con free antes de borrar el dato.

Supongo también que te interesará hacer una lista de datos por lo que tendrás que implementarla, pero eso más adelante.
1413  Programación / Programación C/C++ / Re: Evitar leer el salto de línea cuando leemos cadenas en C en: 8 Marzo 2016, 20:10 pm
Para vaciar el buffer del teclado después de un scanf puedes usar la siguiente línea de código
Código
  1. while(getchar() != '\n');
1414  Foros Generales / Sugerencias y dudas sobre el Foro / Re: El antihack de la página es demasiado restrictivo en: 8 Marzo 2016, 18:09 pm
El error con los char es de hace nada porqué hace dos o tres puse ese código para otra respuesta.
1415  Foros Generales / Sugerencias y dudas sobre el Foro / Re: El antihack de la página es demasiado restrictivo en: 8 Marzo 2016, 16:08 pm
http://pastebin.com/hKZ59GLk

Esto son los dos códigos que hay. El segundo estaba entre etiquetas code=c y /code
1416  Foros Generales / Sugerencias y dudas sobre el Foro / Re: El antihack de la página es demasiado restrictivo en: 8 Marzo 2016, 13:43 pm
Por dos veces he intentado realizar una respuesta a un mensaje en el foro de C++, terminada de redactar y pulsando el botón previsualizar todo va normal pero cuando le he dado al botón de publicar ha aparecido una página web, estándar del servidor, diciendo que había sido bloqueado del foro y que tengo que enviar un mail a los administradores, y todo eso.

Mientras tanto todo va bien, incluso aquí. Pensé que era porque veía código C en la respuesta.

En unas horas lo intento de nuevo a ver si me deja.
1417  Foros Generales / Sugerencias y dudas sobre el Foro / [SOLUCIONADO] El antihack de la página es demasiado restrictivo en: 8 Marzo 2016, 09:32 am
Ya va dos veces que intento realizar una respuesta en el foro de C/C++ y el sistema de protección me bloquea. ¿Cuáles son las nuevas reglas que espera el foro?
1418  Programación / Programación C/C++ / Re: Ayuda programa en C que lee una cadena en: 5 Marzo 2016, 20:29 pm
Las imágenes no se ven.

Sobre tu código:
Código
  1. #include<stdio.h>
  2.  
  3. typedef struct {
  4.    char nombre [30];
  5.    int num_ejemplares;
  6.    char sección; // En muchos compiladores va a fallar tu nombre de variable
  7.                  // pues solo esperan letras del abecedario inglés: sin acentos.
  8.    int habitaculo;
  9.    int dia;
  10.    int mes;
  11.    int año; // Reafirmo lo dicho antes: en este caso se van a quejar de la letra ñ.
  12. } Especie;
  13.  
  14. int menu (void) {
  15.    printf ("Prototipo de la Reserva natural.\n");
  16.    printf ("1. Introducir una nueva especie.\n");
  17.    printf ("2. Listar las especies alojadas.\n");
  18.    printf ("3. Mostrar estadisticas.\n");
  19.    printf ("4. Salir.\n");
  20.  
  21.    // Aquí deberías pedir la opción numérica y devolverla
  22.    // con el return de la función.
  23. }
  24.  
  25. int main () {
  26.    int op;
  27.    while (op != 4){ // Varias cosas: op NO está inicializado, no
  28.                     // debes usar un valor que no hayas inicializado antes.
  29.                     // Los menús mejor hacerlos con un do ... while pues
  30.                     // seguro que querrás mostrarlo almenos una vez.
  31.        op == menu (); // Esto funcionaría en caso de que la función
  32.                       // menu() regresara algo controlado.
  33.        scanf ("%d", &op); // Esta linea y la anterior son contradictorias:
  34.                           // ¿Es la función menu() la que te devuelve la opción
  35.                           // o lo adquieres ahora en la función main()?
  36.        if (op == 1) { // Para resolver opciones de menú queda más límpio el
  37.                       // uso de la sentencia switch
  38.            nuevo ();
  39.        }
  40.    }
  41. }
  42.    //Opcion 1 que permite introducir una nueva especie
  43. void nuevo () {
  44.    Especie e; // e es una variable local. Cuándo termine la función nuevo()
  45.               // e va a desaparecer y con ella todo el trabajo que hayas
  46.               // hecho para rellenarla. C permite devolver estructuras así
  47.               // que en vez de declarar void nuevo() deberías haber declarado
  48.               // Especie nuevo() y recogerlo en main mediante algo parecido a
  49.               // Especie e = nuevo();
  50.    int i;
  51.    char especie [100];
  52.    gets (especie); // gets no se debería usar porqué al no controlar la cantidad
  53.                    // de datos que entran en la cadena podría sobrepasarse el tamaño
  54.                    // máximo del buffer y se sobreescribirían otros datos del programa.
  55.                    // usar fgets(stdin, especie, 100); en su lugar.
  56.    int cont;
  57.    //Mientras sea diferente del - leera el texto
  58.    while (especie [i] != '-') { // Varias cosas aquí que sirven para el resto de
  59.                                 // estructuras similares que hay en el programa:
  60.                                 // i no está inicializado y no se sabe que valor tiene.
  61.                                 // Estás leyendo quien sabe donde.
  62.                                 // Por otra parte i no se actualiza por tanto siempre
  63.                                 // trabajarás sobre la misma posición de memoria.
  64.                                 // Otra cosa: cuándo has recibido una línea formateada con
  65.                                 // delimitadores puedes usar la función strtok de string.h
  66.                                 // para recoger los diferentes datos de la cadena.
  67.        especie [i] = e.nombre;  
  68.    }
  69.    //Se le suma 1 a la posicion de i ya que terminaria en - y debe comenzar a leer desde lo siguiente
  70.    i = i + 1; // Para incrementar en 1 una variable numérica es mejor usar el operador unario ++
  71.               // Aquí quedaría mejor i++;
  72.               // O mejor aún, sobre todo en compiladores antiguos usar ++i por la razón de que el
  73.               // código objeto quedaba aún más optimizado.
  74.    while (especie [i] != '-') {
  75.        especie [i] = e.num_ejemplares; // Las cadenas no se copian mediante el operador =
  76.                                        // esto te serviría para copiar punteros pero en este caso
  77.                                        // perderías la información cuándo el usuario hiciera una nueva
  78.                                        // entrada. En su lugar deberías usar strncpy de string.h
  79.                                        // Por otra parte, y dejando de lado el punto anterior, aquí
  80.                                        // tienes un error de lógica y es que intentas guardar en la cadena
  81.                                        // desde la que estas, en teoría, leyendo, el el valor de la variable
  82.                                        // que debería ser el destino. ***Aunque está mal*** debería ser
  83.                                        // e.num_ejemplares = especie[i]
  84.                                        // Por cierto, i sigue sin saberse a donde se apunta e itera siempre
  85.                                        // en la misma posición. A partir de ahora obviaré este error.
  86.                                        // e.num_ejemplares es un entero, para un usuario es imposible que
  87.                                        // te escriba un entero como tipo de dato en una cadena.
  88.                                        // Deberías crear una cadena auxiliar con, y solo con, el dato numérico
  89.                                        // y pasarlo a entero mediante la siguiente construcción:
  90.                                        // sscanf(cad_auxiliar, "%i", e.num_ejemplares);
  91.        //Controlara que el numero de ejemplares sea un numero y no un caracter
  92.        if (e.num_ejemplares <= '0' || e.num_ejemplares >= '100') { // Entre comillas simples solo se ponen
  93.                                                                    // constantes de caracter.
  94.                                                                    // Las constantes de cadena se ponen entre
  95.                                                                    // comillas dobles.
  96.                                                                    // Pero en tu caso lo que estás comparando son
  97.                                                                    // constantes numéricas por lo que deben ir sin
  98.                                                                    // delimitar.
  99.            printf ("--> Error en el formato de datos.");
  100.        }
  101.    }
  102.    i = i + 1;
  103.    //Lee el dia que introducido
  104.    while (especie [i] != '/') {
  105.        especie [i] = e.dia;
  106.        //Controla que el formato del dia este bien introducido
  107.        if (e.dia <= 0 || e.dia > 31) {
  108.            printf ("--> Error en el formato de datos.");
  109.        }
  110.    }
  111.    i = i + 1;
  112.    //Lee el mes introducido
  113.    while (especie [i] != '/') {
  114.        especie [i] = e.mes;
  115.        //Controla que el formato del mes este bien introducido
  116.        if (e.mes <= 0 || e.dia > 12) {
  117.            printf ("--> Error en el formato de datos.");
  118.        }
  119.    }
  120.    i = i + 1;
  121.    //Lee el año introducido
  122.    while (especie [i] != '/') {
  123.        especie [i] = e.dia;
  124.        //Controla que el formato del año este bien introducido
  125.        if (e.dia <= 1970 || e.dia >= 2060) { // Supongo que aquí querías decir e.año
  126.            printf ("--> Error en el formato de datos.");
  127.        }
  128.    }
  129.    i = i + 1;
  130.    //Lee en que sección esta introducido
  131.    while (especie [i] != '-') {
  132.        especie [i] = e.sección;
  133.        //Controla que la sección este introducida con mayusculas
  134.        if (e.sección < 'A' || e.sección > 'Z') {
  135.            printf ("--> Error en el formato de datos.");
  136.        }
  137.    }
  138.    i = i + 1;
  139.    //Al estar en el final tiene que encontrarse con el \0 para saber que es el habitaculo
  140.    while (especie [i] != '\0') {
  141.        especie [i] = e.habitaculo;
  142.        //Controlara que el numero de habitaculo sea un numero y no un caracter
  143.        if (e.habitaculo <= '0' || e.habitaculo >= '100') {
  144.            printf ("--> Error en el formato de datos.");
  145.        }
  146.    }
  147.    printf ("---> Especie introducida con exito.\n");
  148.    // La función main debe devolver un entero. El estándar dice que se debe
  149.    // devolver 0 si el programa ha tenido éxito. C define una macro llamada
  150.    // EXIT_SUCCESS en stdlib.h usada para éste menester. Puedes elegir la forma
  151.    // que quieras.
  152. }
  153.  
1419  Programación / Programación C/C++ / Re: Pasar argumentos a netbeans en: 5 Marzo 2016, 18:50 pm
Sí, usa los argumentos de la función main.

El prototipo de main con argumentos es
Código
  1. int main(int argc, char *argv[])
int argc es el número de argumentos que se le han pasado al programa
char *argv[] es son los argumentos que se le han pasado al programa.

A tener en cuenta de que siempre el primer argumento, eso es argv[0], es el nombre del programa.
1420  Programación / Programación C/C++ / Re: funcion en c que pueda ser llamada con parámetros de distintos tipos en: 4 Marzo 2016, 20:51 pm
Eso sí es cierto. Para emular ese comportamiento C debería usar punteros a void y funciones callback. Así se tendría una función genérica para sumar cualquier tipo de dato.
Páginas: 1 ... 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 [142] 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 ... 161
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines