Hack x Crack - Comunidad de Seguridad informática

Programación => C / C++ => Mensaje iniciado por: CoZarmo en Septiembre 14, 2018, 11:03:08 pm

Título: ejercicio punteros y estructuras
Publicado por: CoZarmo en Septiembre 14, 2018, 11:03:08 pm
Buenas tardes, veran
tengo que hacer el siguiente programa:
"Escribir un programa que pregunte por el nombre (nombre y apellido paterno) de un estudiante y que busque en un archivo estudiantes.in e imprima en la pantalla toda su informacion. Nota: Cada informacion del estudiante esta separada unicamente por el caracter *".
Ya tengo este codigo:
#include <stdio.h>
#include <stdlib.h>
  #define NET 2
  #define MAX 16
  #define MAXNOM 50

typedef char Tstring[MAX];

  typedef struct
  {
  char camp1[MAX];
  }Tname;

  typedef struct
  {
     Tname name;
     Tstring camp2;
     Tstring camp3;
     Tstring camp4;
  }Tetiqueta;

  struct Tdata
  {
  int Netiqueta;
  Tetiqueta tabla [MAX];
  };

  void main()
  {
     FILE      *fe;
     struct Tdata data;
     char k;
     int i,n;

     fe = fopen("estudiantes.in", "r");
     if (fe == NULL)
     {
   printf("\nError abriendo fichero\n");
   return;
     }

     n=0;
     while( (n<NET) && (!feof(fe)) )
     {
   fscanf(fe, "%[^\n]\n", data.tabla[n].name.camp1);
   fscanf(fe, "%[^\n]\n", data.tabla[n].camp2);
        fscanf(fe, "%[^\n]\n", data.tabla[n].camp3);
   fscanf(fe, "%[^\n]\n", data.tabla[n].camp4);
        fscanf(fe,"*\n");
   n++;
     }

     printf("Dame el nombre del estudiante: ");
     scanf("%s",&k);

    for(i=0; i<NET; i++)
    {
      if(k==data.tabla.name.camp1)
       {
         printf("%s\n", data.tabla.name.camp1);
         printf("%s\n", data.tabla.camp2);
         printf("%s\n", data.tabla.camp3);
         printf("%s\n", data.tabla.camp4);
       }
    }

     fclose(fe);
     return;
  }
pero me aparece el un error en       if(k==data.tabla.name.camp1)
si me pueden ayudar, se los agradecere mucho
Título: Re:ejercicio punteros y estructuras
Publicado por: Villano en Septiembre 17, 2018, 01:05:37 pm
¿Y que error te tira el compilador?. Es importante.
Título: Re:ejercicio punteros y estructuras
Publicado por: dbbeltran en Septiembre 20, 2018, 07:30:14 am
Hola buenas ,

hay varios problemas en tu código y que claramente te llevan al error en en  " if(k==data.tabla.name.camp1) ".

Lo primero es que debe aprender a indentar, comentar el código y definir las variables con un nombre que represente el uso de ella ( no solo por una letra ) . Siempre es bueno que esté ordenado para que sea entendible para otras personas y para uno mismo.

En cuanto al error, se produce por que está tratando de comparar un solo caracter con una cadena de caracteres (palabra), y esto ocurre debido a que  la variable "k" esta definida  como caracter y no como una cadena de caracteres "char k;", esto quiere decir que
cuando se pregunta por el nombre del alumno en "scanf("%s",&k);" esto solo guardará el primer caracter del nombre y no el nombre completo, eso en resumen es el error.

Entonces, para solucionar hay que empezar por guardar bien el nombre del alumno en un arreglo de caracteres algo como "char k[20];" , pero también hay que tener en cuenta que para comparar arreglos de caracteres no es igual que comparar un solo caracter, por ejemplo si tienes una variable "char a" y "char b" para compararlas lo haces "if ( a == b)", pero, si estos fueran arreglos (o cadenas de caracteres) "char arreglo1[20]" y  "char arreglo2[20]" no podrías hacer "if (arreglo1 == arreglo2)", eso sería un error, lo que habría que hacer es incluir la librería "string.h" y hacer uso de sus funciones que operan sobre arreglo de caracteres http://c.conclase.net/librerias/index.php?ansilib=string#inicio en este sitio puede ver cuales son las funciones disponibles y algunos ejemplos, las que te puede ayudar son:
strcpy (arreglo1, arreglo 2) // copia arreglo1 en arreglo2.
strcmp (arreglo1, arreglo2) // compara arreglo1 con arreglo2.
strlen(arreglo) // te calcula el largo del arreglo.
etc..

Si necesita otra función puede buscarla dentro del sitio o en otro, hay mucho material en internet sobre manejo de arreglos o cadenas de caracteres.

Espero que se entienda lo que traté de explicar, pero tiene que empezar por eso.

Saludos  ;)