Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Rotula en 12 Abril 2013, 02:30 am



Título: Preguntas de noob en C
Publicado por: Rotula en 12 Abril 2013, 02:30 am
Buenas gente!
:D

Bueno, os cuento, no controlo C, estoy haciendo un cursillo de introducción y tal. Nos han enviado unos ejercicios para entregar, y anque los he acabado, hay un programa en concreto que hace cosas raras que no entiendo.

Lo peor es que no sé como buscarlo, he dado mil vueltas y ni idea. Es difícil buscar algo si no sabes cómo se llama, y por aquí ya son las 2 am, por hoy me he rendido y os vengo a pedir ayuda T_T

Son dos problemas. Por un lado tengo una variable que debería ir dentro del main (o eso es lo que me dice el sentido comun), pero si la declaro dentro del main, más tarde dentro de un while el valor se pone a 0 en cada iteración, O_o
Si la declaro como variable global, esto no pasa o_O

Y el segundo problema es parecido. Tengo una estructura de datos, y un array de esa estructura. Pues en algun momento del programa el primer campo del primer elemento del array se pone a 0. Con los demás elementos del array no pasa, y si cambio el orden en que declaro los campos de la estructura, siempre es el primero que se pone a 0.

¿Es normal esto? ¿Sabéis porqué pasa y cómo se puede evitar? :S

No sé si pegar el código o no, la verdad es que me da vergüenza, mientras buscaba lo mio entre en el tema de "cosas que no hay que hacer", y yo hago unas cuantas xD
Además son unas 240 línas (contando comentarios y saltos de línea).

Bueno, os pongo el main por si algún alma caritativa entiende qué hago mal :)
Las funciones son practicamente asignaciones y ya...

Muchas gracias de antemano! :D

Código
  1. #include <stdio.h>
  2.  
  3. #define CIERTO 1
  4. #define FALSO 0
  5. #define TAML 30
  6. #define TAMN 50
  7.  
  8. int ocup;
  9. struct cliente {
  10.       int id;
  11.       char nombre[TAMN];
  12.       int saldo;
  13. };
  14.  
  15. void imprimirMenu();
  16. void imprimirVuelta();
  17. struct cliente nuevoCliente();
  18. void mostrarCliente(struct cliente lista[]);
  19. void mostrarLista(struct cliente lista[], int ocup);
  20. void modificarCliente(struct cliente lista[]);
  21. void mostrarInfo(struct cliente *cliente);
  22.  
  23.  
  24. int main (void){
  25.  
  26.  
  27.  
  28.    struct cliente clientes[TAML];
  29.    ocup = 0; //ocupacion del array
  30.    char op; //opción del menu
  31.    int exit = FALSO;
  32.  
  33.    //navegar por el menu
  34.    while (exit != CIERTO){
  35.          imprimirMenu();
  36.          scanf("%s", &op); //despues de esta instruccion ocup = 0 si
  37.                                     //la declaro dentro del main :S
  38.          switch (op){
  39.                 case 'a':
  40.                 case 'A':
  41.                      clientes[ocup] = nuevoCliente();
  42.                      ocup++;
  43.                 break;
  44.  
  45.                 case 'b':
  46.                 case 'B':
  47.                      mostrarCliente(clientes);
  48.                 break;    
  49.  
  50.                 case 'c':
  51.                 case 'C':
  52.                      mostrarLista(clientes, ocup);
  53.                 break;
  54.  
  55.                 case 'd':
  56.                 case 'D':
  57.                      modificarCliente(clientes);
  58.                 break;    
  59.  
  60.                 case 'e':
  61.                 case 'E':
  62.                      exit = CIERTO;
  63.                 break;
  64.  
  65.                 default:
  66.                         printf("Opcion no reconocida, vuelva a escoger.\n");
  67.                         fflush(stdin);
  68.                         getchar();
  69.                 break;
  70.  
  71.          }
  72.  
  73.    }
  74.    printf("Presione enter para salir.\nHasta otra!!!");
  75.  
  76.     fflush(stdin);
  77.     getchar();
  78.  
  79.    return 0;
  80.  
  81. }


Título: Re: Preguntas de noob en C
Publicado por: rir3760 en 12 Abril 2013, 03:29 am
Con esta llamada:
Código
  1. char op;
  2.  
  3. /* ... */
  4.  
  5. scanf("%s", &op);
La función scanf almacena en la dirección indicada por "&op" una palabra (secuencia de caracteres diferentes de espacio blanco), a continuación de esta almacena un '\0'. El problema aquí es que "op" solo puede almacenar un carácter mientras que scanf por fuerza almacenara al menos dos (un carácter cualquiera y el '\0').

A partir de ese momento (la llamada a función) cualquier cosa puede pasar, incluyendo el comportamiento que mencionas.

La forma correcta es:
Código
  1. char op;
  2.  
  3. /* ... */
  4.  
  5. scanf(" %c", &op);


Un saludo


Título: Re: Preguntas de noob en C
Publicado por: Rotula en 12 Abril 2013, 10:33 am
Ostia, ciertamente Rir, ciertamente.

Muchas gracias, te quiero pero que muy mucho :D