我试图从.text文件中读取一个结构,然后将其保存在一个新的文本文件中以查看它是否有效,但是当它被保存时,臭名昭着的错误出现在"运行时检查失败#2 - 围绕变量' pers'已损坏" 。 我不知道应该给 struct persona pers 赋予哪个尺寸以使其工作。 这是.txt文件:
Mirio Togata
18937332
15/7/1951
Shigaraki Tomura17304739
24/11/1930
这是代码:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#define LNOM 32
#define TAM 2 /*The size I established for the struct persona is 2 because there are 2 people*/
struct fecha { int d, m, a; };
struct persona
{
char nombre[LNOM];
int dni;
struct fecha nacim;
};
int readText(struct persona l[], int cant)
{
printf("Leyendo...\n");
char nom[LNOM];
FILE *pf = fopen("persona.txt", "r");
if (pf)
{
fgets(nom, LNOM, pf);
while (!feof(pf))
{
strcpy(l[cant].nombre, nom);
fscanf(pf, "%d", &l[cant].dni);
fgetc(pf);
fscanf(pf, "%d/%d/%d", &l[cant].nacim.d, &l[cant].nacim.m, &l[cant].nacim.a);
fgetc(pf);
cant++;
fgets(nom, LNOM, pf);
}
fclose(pf);
}
return cant;
}
void saveText(struct persona l[], int cant)
{
printf("Grabando...\n");
int i;
FILE *pf = fopen("personados.txt", "w");
if (pf)
{
for (i = 0; i < cant; i++)
{
fprintf(pf, "%s\n", l[i].nombre);
fprintf(pf, "%d\n", l[i].dni);
fprintf(pf, "%d/%d/%d\n", l[i].nacim.d, l[i].nacim.m, l[i].nacim.a);
}
fclose(pf);
}
}
int main(void)
{
int cant = 0;
struct persona pers[TAM];
cant = readText(&pers[TAM],cant);
saveText(&pers[TAM],cant);
return 0;
}
提前致谢。
答案 0 :(得分:0)
首先是数组索引的复习。
pers[0]
提供persona
中的第一个pers
。
pers[1]
将提供第二个,
pers[2]
将是第三个。这个序列可以持续很长一段时间,但因为
#define TAM 2
将所有TAM
替换为2
struct persona pers[TAM];
成为
struct persona pers[2];
所以pers
只有两个有效的条目。这也意味着
pers[TAM]
成为
pers[2]
我们在上面看到的获得pers
中的第三个元素,我们现在知道pers
中没有第三个元素。
所以
cant = readText(&pers[TAM],cant);
获取pers
不存在的第三个元素的地址,并将其作为readText
传递到l
。由于l
指向pers
的有效范围,因此读入l
指向的元素将损坏堆栈并导致错误消息。
解决方案是阅读pers
,&pers[0]
或&pers[1]
的有效元素。由于readText
将从文件中读取两个条目,从&pers[1]
开始并读入元素2,不建议使用不存在的元素3.