Necesito ayuda con este programa.

Resuelto/Cerrado
unodeverde Mensajes enviados 4 Fecha de inscripción jueves, 30 de abril de 2009 Estatus Miembro Última intervención martes, 19 de mayo de 2009 - 30 abr 2009 a las 19:43
 unodeverde - 2 may 2009 a las 13:48
Hola, a todos.
Tengo un problema con este ejercicio. Resulta que la función en la cual tengo que devolver la cadena en pantalla cada palabra en una linea diferente no va, aunque cuando compilo me dice que no hay errores. Me parece que hay un error con la asignación de memoria, con los punteros, haber si un cinturón negro en lenguaje C me hecha una mano. Utilizo como compilador el Borland C++ 5.01.
Gracias de antemano.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

void introducir(char nombre[],char apellido1[],char apellido2[], char *p, char *p1, char *p2);
void mostrar(char nombre[],char apellido1[],char apellido2[]);
void concatena(char nombre[],char apellido1[],char apellido2[], char *p, char *p1, char *p2,char cadena[],char*p4);
void linea(char cadena[],char *p4);
void cadacadena(char nombre[],char apellido1[],char apellido2[], char *p, char *p1, char *p2,char cadena[],char *p4);
main(){
char nombre[20];
char apellido1[20];
char apellido2[20];
char cadena[60];
char *p;
char *p1;
char *p2;
char *p4;
p=&nombre[0];
p1=&apellido1[0];
p2=&apellido2[0];
printf("\INTRODUCIR DATOS PERSONALES.\n");
introducir(nombre,apellido1,apellido2,p,p1,p2);
printf("\MOSTRAR TODOS LOS DATOS.\n");
mostrar(nombre,apellido1,apellido2);
printf("\MOSTRAR CADENA CONCATENADA.\n");
concatena(nombre,apellido1,apellido2,p,p1,p2,cadena,p4);
printf("\nMOSTRAR EN CADA LINEA.\n");
linea(cadena,p4);
cadacadena(nombre,apellido1,apellido2,p,p1,p2,cadena,p4);
free;
system("PAUSE");
}
//-------------------------------------------------------------------------------------------------------------------------//
void introducir(char nombre[],char apellido1[],char apellido2[], char *p, char *p1, char *p2){
printf("\nIntroduce el nombre: ");
gets(nombre);
strlwr(nombre);
*p=toupper(*p);
printf("\nIntroduce el primer apellido: ");
gets(apellido1);
strlwr(apellido1);
*p1=toupper(*p1);
printf("\nIntroduce el segundo apellido: ");
gets(apellido2);
strlwr(apellido2);
*p2=toupper(*p2);
}
//-------------------------------------------------------------------------------------------------------------------------//
void mostrar(char nombre[],char apellido1[],char apellido2[]){
printf("Nombre: %s\n",nombre);
printf("Apellido1: %s\n",apellido1);
printf("Apellido2: %s\n",apellido2);
puts("");
}
//-------------------------------------------------------------------------------------------------------------------------//
void concatena(char nombre[],char apellido1[],char apellido2[], char *p, char *p1, char *p2,char cadena[],char *p4){
strcpy(cadena,nombre);
strcat(cadena," ");
strcat(cadena,apellido1);
strcat(cadena," ");
strcat(cadena,apellido2);
p4=(char*)malloc(sizeof(char));
p4=&cadena[0];
*p4=toupper(*p4);
printf("Cadena concatenada: %s\n",cadena);
}
//------------------------------------------------------------------------------------------------------------------------//
void linea(char cadena[],char *p4)
{
p4=&cadena[0];
while(*p4!='\0')
{
printf("%s",*p4);
p4++;
if(*p4==' ')
{
printf("\n");
}
}
}
//-------------------------------------------------------------------------------------------------------------------------//
void cadacadena(char nombre[],char apellido1[],char apellido2[], char *p, char *p1, char *p2,char cadena[],char *p4){
printf("Estas son las longitudes de las cadenas.\n");
printf("1ª cadena: %d caracteres.\n",strlen(nombre));
printf("2ª cadena: %d caracteres.\n",strlen(apellido1));
printf("3ª cadena: %d caracteres.\n",strlen(apellido2));
printf("4ª cadena: %d caracteres.\n",strlen(cadena));
}
//-------------------------------------------------------------------------------------------------------------------------//
Consulta también:

1 respuesta

Veo que no he tenido mucho exito.
No hay absolutamente nadie que me pueda hechar una mano.
De todas formas os dejo otro porque yo me vuelvo loco con estos dos programas.
Haber si hay alguna alma caricativa, por favor.
Gracias de todas formas, incluso a los que se molestan en leerlo.

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
typedef struct
{
char nombre[20],apellidos[30];
int etapa,curso,nota1,nota2,nota3;
float media;
}campos;
void introducir(campos datos);
void mostrar(campos datos);
void suspensos4(campos datos);
void mostraraprobados2B(campos datos);
void ultimo(campos datos);
main()
{
campos datos;
FILE *p;
introducir(datos);
mostrar(datos);
suspensos4(datos);
mostraraprobados2B(datos);
ultimo(datos);
getchar();
getchar();
system("PAUSE");
}
void introducir(campos datos)
{
char grabar='S';
FILE *p;
if((p=fopen("fichero.bin","wb"))==NULL)
{
printf("Error.");
fflush(stdin);
getchar();
}
else
{
do
{
printf("\nIntroducir nombre:");
fflush(stdin);
gets(datos.nombre);
strlwr(datos.nombre);
datos.nombre[0]=toupper(datos.nombre[0]);
printf("\nIntroducir apellidos:");
fflush(stdin);
gets(datos.apellidos);
strlwr(datos.apellidos);
datos.apellidos[0]=toupper(datos.apellidos[0]);
do
{
printf("\nSabiendo que ESO(1), Bachillerato(2) y Ciclo formativo(3), introduce el digito perteneciente a la etapa etapa:");
scanf("%d",&datos.etapa);
}while((datos.etapa!=1)&&(datos.etapa!=2)&&(datos.etapa!=3));
do
{
printf("\nSabiendo que ESO(1,2,3,4); Bachillerato(1,2) y Ciclo formativo(1,2), introduce el digito perteneciente al curso:");
scanf("%d",&datos.curso);
}while((datos.curso!=1)&&(datos.curso!=2)&&(datos.curso!=3)&&(datos.curso!=4));
do
{
printf("\nIntroduce la primera nota:");
scanf("%d",&datos.nota1);
}while((datos.nota1<=0)&&(datos.nota1>=10));
do
{
printf("\nIntroduce la segunda nota:");
scanf("%d",&datos.nota2);
}while((datos.nota2<=0)&&(datos.nota2>=10));
do
{
printf("\nIntroduce la tercera nota:");
scanf("%d",&datos.nota3);
}while((datos.nota3<=0)&&(datos.nota3>=10));
datos.media=((datos.nota1+datos.nota2+datos.nota3)/3);
printf("\nLa nota media es: %.f .\n",datos.media);
fwrite(&datos,sizeof(campos),1,p);
printf("\nDeseas grabar datos de algún alumno (S/N):");
fflush(stdin);
scanf("%c",&grabar);
}while((grabar=='s')||(grabar=='S'));
}
fclose(p);
system("PAUSE");
}
//-------------------------------------------------------------------------------------------------------------------------//
void mostrar(campos datos)
{
FILE *p;
rewind(p);
if((p=fopen("fichero.bin","rb"))==NULL)
{
printf("Error.");
fflush(stdin);
getchar();
}
else
{
fread(&datos,sizeof(campos),1,p);
while(!feof(p))
{
printf("\nEl nombre del alumno es: %s",datos.nombre);
printf("\nEl nombre del apellidos es: %s",datos.apellidos);
printf("\nLa etapa del alumno es: %d",datos.etapa);
printf("\nEl curso del alumno es: %d",datos.curso);
printf("\nLa 1ª nota del alumno es: %d",datos.nota1);
printf("\nLa 2ª del alumno es: %d",datos.nota2);
printf("\nLa 3º del alumno es: %d",datos.nota3);
printf("\nLa nota media del alumno es: %f\n\n\n",datos.media);
fread(&datos,sizeof(campos),1,p);
}
fclose(p);
system("PAUSE");
}
}
//-------------------------------------------------------------------------------------------------------------------------//
void suspensos4(campos datos)
{
FILE *p;
if((p=fopen("fichero.bin","rb"))==NULL)
{
printf("Error.");
fflush(stdin);
getchar();
}
else
{
printf("\nNombre y apellidos de la nota media suspensa 4 ESO.\n\n\n");
fread(&datos,sizeof(campos),1,p);
int suspenso=0,contador=0;
while(!feof(p))
{
fread(&datos,sizeof(campos),1,p);
if(datos.curso==4)
{
if(datos.media<5)
{
contador++;
printf("\nEl nombre del alumno es: %s",datos.nombre);
printf("\nEl nombre del apellidos es: %s",datos.apellidos);
printf("\nLa nota media del alumno es: %f",datos.media);
fread(&datos,sizeof(campos),1,p);
}
}
}
if(suspenso==0)
{
printf("\nNo hay suspensos.\n");
}
else
{
printf("\nEl numero de suspensos es %d.\n",contador);
}
}
fclose(p);
system("PAUSE");
}
//-------------------------------------------------------------------------------------------------------------------------//
void mostraraprobados2B(campos datos)
{
FILE *p;
int cont=0;
if((p=fopen("fichero.bin","rb"))==NULL)
{
printf("Error.");
fflush(stdin);
getchar();
}
else
{
printf("\nNombre y apellidos de la nota media aprobados Segundo Bachillerato.\n\n");
fread(&datos,sizeof(campos),1,p);
while(!feof(p))
{
fread(&datos,sizeof(campos),1,p);
if(datos.etapa==2)
{
fread(&datos,sizeof(campos),1,p);
if (datos.curso==2)
{
fread(&datos,sizeof(campos),1,p);
if(datos.media>4)
{
cont++;
printf("\nEl nombre del apellidos es: %s",datos.apellidos);
printf("\nLa nota media del alumno es: %f",datos.media);
fread(&datos,sizeof(campos),1,p);
if(cont==0)
{
printf("\nNo hay aprobados en Segundo de Bachillerato.");
}
else
{
printf("\nEl numero de aprobados en Segundo de Bachillerato es: %d",cont);
}
}

}
}
}
}
fclose(p);
system("PAUSE");
}
//----------------------------------------------------------------------------------------------------------------------//
void ultimo(campos datos)
{
FILE *p;
int registro='s';
if((p=fopen("fichero.bin","rb"))==NULL)
{
printf("Error.");
fflush(stdin);
getchar();
}
else
{
printf("Desea mostrar el ultimo registro (S/N):");
scanf("%c",registro);
while((registro=='s')||(registro=='S'))
{
fseek(p,2,0);
fread(&datos,sizeof(campos),1,p);
if(!feof(p))
{
printf("\nEl nombre del alumno es: %s",datos.nombre);
printf("\nEl nombre del apellidos es: %s",datos.apellidos);
printf("\nLa etapa del alumno es: %d",datos.etapa);
printf("\nEl curso del alumno es: %d",datos.curso);
printf("\nLa 1ª nota del alumno es: %d",datos.nota1);
printf("\nLa 2ª del alumno es: %d",datos.nota2);
printf("\nLa 3º del alumno es: %d",datos.nota3);
printf("\nLa nota media del alumno es: %f",datos.media);
fread(&datos,sizeof(campos),1,p);
}
}
}
fclose(p);
system("PAUSE");
}
//-------------------------------------------------------------------------------------------------------------------------//
-1