这段代码编译没有问题,但是当我运行它时,它崩溃并且不起作用。 我注意到错误就在这部分
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/