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

 

 


Tema destacado: Entrar al Canal Oficial Telegram de elhacker.net


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Preguntas de noob en C
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Preguntas de noob en C  (Leído 1,525 veces)
Rotula

Desconectado Desconectado

Mensajes: 23


Ver Perfil
Preguntas de noob en C
« 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. }


En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Preguntas de noob en C
« Respuesta #1 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


En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Rotula

Desconectado Desconectado

Mensajes: 23


Ver Perfil
Re: Preguntas de noob en C
« Respuesta #2 en: 12 Abril 2013, 10:33 am »

Ostia, ciertamente Rir, ciertamente.

Muchas gracias, te quiero pero que muy mucho :D
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Un par de preguntas en mis codigos de noob
Programación C/C++
eimattz 1 1,343 Último mensaje 12 Abril 2017, 12:49 pm
por Sergio14rp
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines