Las instancias de las estructuras en C++ son como las instancias de cualquier otro tipo, en tanto que si las pasas como argumento a una función sin utilizar ni punteros o referencias, dentro de la función estás trabajando con una variable que es una copia de la original.
Es por eso que te queda sin inicializar la biblioteca de main() y ves basura al mostrarla. En el ejemplo lo único que cambio de tu código es la declaración del prototipo y la declaración de argumentos de la función cargar, para que reciban una referencia a la biblioteca (no se hace copia y accedes diractamente a la instancia global de main).
La segunda pregunta no entiendo bien a que te referis. Saludos espero que te sirva.
Código:
# include <iostream>
#include <string>
#include <sstream>
#include <conio.h>
#define j 3
using namespace std;
void cargar( struct biblioteca& );
void mostrar( biblioteca );
int i;
struct libro{
char titulo[10];
char autor[6];
char categoria[10];
};
struct biblioteca{
libro l [j];
char direccion[8];
};
int main (){
biblioteca bli;
cargar(bli);
getch();
mostrar(bli);
}
void cargar (biblioteca& bli)
{
cout<<"Ingresar la direccion : ";
cin >> bli.direccion;
for(i=0;i<j;i++){
cout<<"Ingresar titulo : ";
cin>>bli.l[i].titulo;
cout<<"ingresar autor :";
cin>>bli.l[i].autor;
cout<<"ingresar categoria: ";
cin>>bli.l[i].categoria;
cout<<endl;
}
}
void mostrar (biblioteca bli){
cout<<"la direccion es : "<<bli.direccion<<endl;
for(i=0;i<j;i++){
cout<<endl;
cout<<"los titulos son: "<<bli.l[i].titulo<<endl;
cout<<"los autores son : "<<bli.l[i].autor<<endl;
cout<<"las categorias son : "<<bli.l[i].categoria<<endl;
getch();
}
}