c - 无法将数组分配给双指针

标签 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条数据。

最佳答案

您没有正确检测到行尾:

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

在 Linux 计算机上,换行符是 \n,而不是 \r。结果,您继续写入辅助数组的末尾,调用 undefined behavior .

您需要添加对\n的检查:

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

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

关于c - 无法将数组分配给双指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45925436/

相关文章:

c - 使用 libavcodec 的 mpegts 容器中的原始 H264 帧

谁能弄清楚这个方法(C 语言)在做什么?尝试在作业中理解这一点

c - sprintf 自行截断输出字符串

c - windows下EOF的值

c - 在c中标记字符串时出现seg错误

c - float和int的内存表示

计算数组内的十六进制偏移量

c - 为什么这个简单的链表程序会出现段错误?

c - 父进程在无限循环中杀死子进程

c - 如何克服c中的双重释放或损坏(出)中止(核心转储)