El problema está en cómo estás guardando los nombres y apellidos en las variables nombre y apellido. En cada iteración del bucle for, estás sobrescribiendo el valor anterior con el nuevo nombre o apellido ingresado. Por eso, al mostrar la cadena nombreApellido, solo ves el último nombre y apellido ingresado.
Para solucionarlo, puedes usar un array de cadenas para almacenar los nombres y apellidos de los alumnos. Aquí tienes una versión corregida de tu código:
#include <iostream>
#include <string.h>
using namespace std;
int main() {
const int cantAlumnos = 5;
char nombre[cantAlumnos][40];
char apellido[cantAlumnos][40];
char nombreApellido[cantAlumnos][80];
cout << endl;
for (int i = 0; i < cantAlumnos; i++) {
cout << "Ingrese el nombre del alumno " << i + 1 << ": ";
cin.getline(nombre[i], 40, '\n');
}
cout << endl;
for (int i = 0; i < cantAlumnos; i++) {
cout << "Ingrese el apellido del alumno " << i + 1 << ": ";
cin.getline(apellido[i], 40, '\n');
}
for (int i = 0; i < cantAlumnos; i++) {
strcpy(nombreApellido[i], nombre[i]);
strcat(nombreApellido[i], " ");
strcat(nombreApellido[i], apellido[i]);
cout << endl << "El nombre completo del alumno " << i + 1 << " es: " << nombreApellido[i] << endl;
}
cout << endl;
return 0;
}
En este código, hemos creado arrays bidimensionales nombre y apellido para almacenar los nombres y apellidos de los alumnos respectivamente. También hemos creado un array nombreApellido para guardar el nombre completo de cada alumno.
En cada iteración del bucle, los nombres y apellidos se guardan en las posiciones correspondientes de los arrays nombre y apellido. Luego, se concatenan usando strcpy, strcat y un espacio en blanco, y se almacenan en nombreApellido[i].
Finalmente, se muestra en pantalla el nombre completo de cada alumno dentro del bucle for.