C文件中的分段错误

时间:2015-10-02 20:48:43

标签: c fault

我在函数imprimir中得到第二个文件的时刻有一个分段错误,我不知道发生什么事,因为他打开并阅读了firts而不是其他文件,对我很困惑,请帮帮我< / p>

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

typedef struct
{
    char nombre[40];
    int creditos;
    float nota;
} curso;

int conteo(FILE *_entrada);
void semestre(FILE *_entrada,curso *_materias,int *_cantidad,int *_ganadas,int *_perdidas,float *_promedio);
void imprimir(curso *_materias,int *_cantidad,int *_ganadas, int *_perdidas,float *_promedio);

int main(int argc, char *argv[])
{
    int ganadas=0;
    int perdidas=0;
    float promedio=0.0;
    int cantidad=0;
    char *archivoEntrada;
    curso *materias;
    printf("Archivo de entrada \n");
    scanf("%s",archivoEntrada);
    FILE *entrada;
    entrada=fopen(archivoEntrada,"r");
    if(entrada==NULL)
    {
        printf("No se logro abrir el archivo de entrada\n");
        exit(EXIT_FAILURE);
    }
    cantidad=conteo(entrada);
    printf("El numero de materias es: %d \n",cantidad);

    materias=(curso *)malloc(sizeof(curso)*cantidad);

    semestre(entrada,materias,&cantidad,&ganadas,&perdidas,&promedio);
    imprimir(materias,&cantidad,&ganadas,&perdidas,&promedio);
    free(materias);
}

int conteo(FILE *_entrada)
{
    int i=0;
    char auxiliar[40];
    while(!feof(_entrada))
    {
        fgets(auxiliar,40,_entrada);
        i++;
    }
    rewind(_entrada);
    return i/3;
}

void semestre(FILE *_entrada,curso *_materias,int *_cantidad,int *_ganadas,int *_perdidas,float *_promedio)
{
    int i=0;
    int sumaCreditos=0;
    float sumaNotas=0.0;
    while(i<*_cantidad)
    {
        fscanf(_entrada, "%s", _materias->nombre);
        fscanf(_entrada, "%d", &_materias->creditos);
        sumaCreditos=sumaCreditos+(_materias->creditos);
        fscanf(_entrada, "%f", &_materias->nota);
        if((_materias->nota)>3.0)
        {
            *_ganadas=(*_ganadas)+1;
        }
    }
}

void imprimir(curso *_materias,int *_cantidad,int *_ganadas, int *_perdidas,float *_promedio)
{
    fflush(stdin);
    printf("Ganadas %d \n",*_ganadas);
    printf("perdidas %d \n",*_perdidas);
    printf("prom %f \n",*_promedio);
    char *archivoSalida;
    FILE *salida;
    printf("Archivo de salida \n");
    scanf("%s",archivoSalida);
    salida=fopen(archivoSalida,"w");
    if(salida==NULL)
    {
        printf("No se logro abrir el archivo de salida\n");
        exit(EXIT_FAILURE);
    }
    //Implementacion imprimir en archivo salida.txt
}

1 个答案:

答案 0 :(得分:3)

你有

char *archivoSalida;

然后

scanf("%s",archivoSalida);

这里的问题是指针archivoSalida实际上并没有指向任何特殊的地方。未初始化的局部变量(如archivoSalida)具有不确定值。在没有初始化的情况下使用它们会导致未定义的行为,这是导致崩溃的常见原因。

相反,您可能希望使用固定大小的数组:

char archivoSalida[256];
...
scanf("%255s",archivoSalida);