Yo pudiera aportarte lo siguiente, numero las lineas para tener una mejor referencia
Código:
1 void lee_extra(void)
2 {
3 int i=0,cat;
4 char nom[40];
5 printf("INTRODUCIR HORAS EXTRAS TRABAJADAS: \n");
6 printf("introduce el nombre del trabajador: ");
7 fflush(stdin);
8 gets(nom);
9 while(nom[0]!='*'){
10 printf("introduce la categoria: ");
11 scanf("%d",&cat);
12 for(i=0;i<TAM;i++){
13 printf("nombre: %s",emple[i].nombre);
14 printf("\n%s",nom);
15 if(emple[i].nombre==nom){
16 printf("introduce el numeor de horas extras trabajadas: ");
17 scanf("%d",&emple[i].num_extras);
18 }
19 }
20 printf("\npulse FIN para terminar\n");
21 fflush(stdin);
22 printf("introduce el nombre del trabajador: ");
23 gets(nom);
24 }
25 }
De acuerdo al sistema que emplees hay ocasiones en las que al definir un array de tipo char te arroja basura, por eso conviene inicializar el array. Yo utilizo memset. Sería memset(nom,'\0',sizeof(nom)); antes de la linea 8 y 23. Tambien como reutilizas el array, si un primer nombre es mayor a un segundo nombre te dejará los caracteres extras del tamaño de los arrays, tambien por eso es conveniente limpiar el array antes de cargarlo.
En la linea 15 al realizar la comparacion de dos cadenas requieres de emplear strcmp de la librearia string.h. En esa linea creo que tendrias que comparar tambien la categoria, bueno eso es lo que entiendo del enunciado de arriba.
No se si sea necesario para tu prog que muestres el nombre de todos los trabajadores como lo haces en laa lineas 13 y 14, igual lo ocupas para validar lo que se esta comparando...
Es lo que yo le veo...