Copiar una cadena en una matriz char

Hola, quiero copiar la entrada de un usuario en una matriz de caracteres que se define en una estructura. Sinceramente no tengo idea de cómo hacer esto.

#include  #include  int main () { struct employee { char firstname[11]; char lastname[11]; char number[11]; int salary; } int i; int nemps; const int maxemps = 5; struct employee* emps[maxemps]; printf("How many employees do you want to store?(max:5): "); scanf("%d", nemps); for (i = 0; i < nemps; i++) { printf("Employee 1./nLast name:"); scanf("....")// Read the string and copy it into char lastname[] } } 

En primer lugar, struct employee* emps[maxemps]; crea una matriz de punteros para estructurar empleados con tamaño máximo de matriz. En realidad, no ha reservado espacio en la memoria para las estructuras reales, solo los punteros que apuntarán a ellas. Para asignar dinámicamente el espacio en el montón para sus estructuras para que pueda usarlas de manera significativa, tendrá que pasar por alto una llamada a malloc() así:

 for (i = 0; i < maxemps; i++) { emps[i] = malloc(sizeof(struct employee)); } 

También deseará un bucle similar al final de su progtwig que free() cada puntero.

A continuación, cuando recibe información de un usuario, realmente desea utilizar fgets() en scanf() porque fgets() permite especificar la cantidad de caracteres para leer, de modo que pueda evitar los desbordamientos en su búfer de destino.

Actualizar

Si desea trabajar con un struct employee única sin el uso de punteros, esto se logra declarando uno o más struct employee en la stack y luego utilizando el . operador de acceso miembro de la siguiente manera:

 struct employee emp; fgets(emp.lastname, sizeof(emp.lastname), stdin); 

Actualización2

He encontrado una serie de errores en su código. Por favor, vea este enlace para una muestra de trabajo con comentarios.

Solo necesitas:

 scanf("%10s", (emps[i])->last_name); 

Aquí "%10s" denota una cadena con una longitud máxima de 10, y cargará la cadena a last_name.

En C, la cadena se representa como una matriz de caracteres, con '\0' como final.

El uso de scanf aquí es vulnerable a los ataques de búfer si la entrada del usuario es superior a 10: http://en.wikipedia.org/wiki/Scanf#Security , por lo que debe asignar una longitud máxima al formato.