无法将数组分配给双指针

时间:2017-08-28 18:41:17

标签: c

这段代码编译没有问题但是当我运行它时,这会崩溃并且不起作用。 我注意到了,错误发生在这部分

EXTRAE_DATOS(nombre_alumno[i] , alias);

我不知道出了什么问题,请帮助。

#include <stdlib.h>
#include <string.h> //strlen
#include <stdio.h>

#define fila 2     //<<<<<<<<<<<<<<<<<<<<<<<<<< AQUI DESPUES HAY QUE CAMBIAR POR 500000, PUSE 2 PARA PROBAR CON 2 DATOS
#define columna 50

void EXTRAE_DATOS(char *variable, FILE *file);

int main()
{
    FILE *alias;
    alias = fopen("datos.txt","r");
    if (alias == NULL)
    {
        printf("\nError: El archivo 'datos.txt' no se ha encontrado.\n");
    }


    char **nombre_alumno; 

    int Matricula_alumno=1;

    nombre_alumno=(char**)malloc(fila*sizeof(char*));

    int i;

    //recorro el vector dinamico nombre_alumno para hacer vectores en cada uno de sus elementos
    for(i=0;i<fila;i++)
    {
        nombre_alumno[i]=(char*)malloc(columna*sizeof(char));
        if(nombre_alumno[i]==NULL)
        {
            printf("No se ha podido reservar memoria");
            exit(1);
        }
    }
    //dandole valores a la primera matriz nombre_alumno
    for(i=0;i<fila;i++)
    {
        EXTRAE_DATOS(nombre_alumno[i] , alias);   // <<<<<<<<<<------------ AQUI ESTA EL PROBLEMA  
    }


    for(i=0;i<fila;i++)
    {

        printf("INSERT INTO ALUMNO VALUES (%d,'%s');\n",Matricula_alumno,nombre_alumno[i]);
        Matricula_alumno++;

    }

//Function to extract the data from the file
void EXTRAE_DATOS(char *variable, FILE *file)
{
    int fin_campo , i;
    char auxiliar[50];
    char caracter;

    i = 0;
    fin_campo = 0;

    while(fin_campo == 0)      //Lee todo un campo caracter por caracter.
    {
        caracter = fgetc(file);
        if((caracter == '\r' || caracter == ','))
        {
            fin_campo = 1;
        }
        else
        {
            auxiliar[i] = caracter;
            i++;
        }
    }
    auxiliar[i] = '\0';
    strcpy(variable , auxiliar);
}

我在里面创建了一个名为“datos”的txt文件,只是为了证明: 的吉娜,巴特莱

原始txt必须有50000个数据。

2 个答案:

答案 0 :(得分:2)

您没有正确检测到该行的结尾:

    if((caracter == '\r' || caracter == ','))
    {
        fin_campo = 1;
    }
    else
    {
        auxiliar[i] = caracter;
        i++;
    }

在Linux计算机上,换行符为\n,而不是\r。因此,您继续编写auxiliar数组的末尾,并调用undefined behavior

您需要为\n添加支票:

if((caracter == '\n' || caracter == '\r' || caracter == ','))

此外,您应该将caracter的类型更改为int。这样,您可以检查EOF并在这种情况下突破循环。您还应该检查i是否超过字符串的长度。

答案 1 :(得分:0)

你的循环是无限的,这意味着你在边界之外写作并调用未定义的行为。

要解决此问题,您必须将caracter声明为int

然后你必须检查caracters(从文件读取字符后)是否等于EOF或换行符。

更改

if((caracter == '\r' || caracter == ','))

if((caracter == '\n' || caracter == ','))

并添加EOF检查。

if (caracter == EOF) { return EOF; }

// In main exit loop after reaching EOF

if(EXTRAE_DATOS(nombre_alumno[i] , alias) == EOF) break;

打印后也不要忘记释放已分配的内存。

<强> Corrected code.