调试的时候,读到strcpy开始之后就一直闪回报错,不知道是因为什么?
```c
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#include"student.h"
typedef struct course
{
char name[5];
int ID;
int section;
}course;
typedef struct student
{
char Firstname[100];
char Lastname[100];
char SSN[15];
int number;//number of course attending
course Arraycourse[10];
struct student* next;
}student;
void ReadInputFile(char* filename, student* stu)
{
FILE* fp;
fopen_s(&fp, filename, "rt");
if (!fp)
{
printf("open file error");
}
stu = (student*)malloc(sizeof(student) * 2);
for (int i = 0; i < 2; i++)
{
fscanf_s(fp, "%s%s%s%d", stu[i].Firstname, sizeof(stu[i].Firstname),
stu[i].Lastname, sizeof(stu[i].Lastname),
stu[i].SSN, sizeof(stu[i].SSN),
&stu[i].number);
printf("%s\n%s\n%s\n%d\n", stu[i].Firstname,
stu[i].Lastname,
stu[i].SSN,
stu[i].number);
for (int j = 0; j < stu[i].number; j++)
{
fscanf_s(fp, "%s%d%d", stu[i].Arraycourse[j].name, sizeof(stu[i].Arraycourse[j].name),
&stu[i].Arraycourse[j].ID, &stu[i].Arraycourse[j].section);
printf("%s %d %d\n", stu[i].Arraycourse[j].name,
stu[i].Arraycourse[j].ID, stu[i].Arraycourse[j].section);
}
}
fclose(fp);
}
void AddToList(student* addStudent)
{
student* prev, * p;
prev = (student*)malloc(sizeof(student));
head = prev;
for (int i = 0; i < 10; i++)
{
p = (student*)malloc(sizeof(student));
strcpy_s(p->Firstname, addStudent[i].Firstname);
strcpy_s(p->Lastname, addStudent[i].Lastname);
strcpy_s(p->SSN, addStudent[i].SSN);
p->number = addStudent[i].number;
for (int j = 0; j < p->number; j++)
{
strcpy_s(p->Arraycourse[j].name, addStudent[i].Arraycourse[j].name);
p->Arraycourse[j].ID = addStudent[i].Arraycourse[j].ID;
p->Arraycourse[j].section = addStudent[i].Arraycourse[j].section;
}
p->next = NULL;
prev->next = p;
prev = p;
}
}
```
不知道你这个问题是否已经解决, 如果还没有解决的话:#include <stdio.h>
#include <string.h>
void myStrNCpy(char *des, char *src, int len) {
int i;
for (i = 0; i < len && src[i] != '\0'; i++) {
des[i] = src[i];}
for (i = 0; i < len; i++) ;
des[i] = '\0';
printf("des:%s\n",des);
}
int main() {
char des[10];
char src[10];
printf("input src\n");
scanf("%s", src);
int len;
len = strlen(src);
myStrNCpy(des, src, len);
return 0;
}
参考GPT和自己的思路:根据代码片段,可以发现在函数ReadInputFile中,将指针变量stu分配了一段内存,并读取了文件中的数据填充到这个内存上。但是,因为stu是传递进来的一个指针变量,函数中对该指针的操作并不会影响到函数外部所指向的内存区域。因此,在函数外部调用ReadInputFile函数时,stu并没有被正确赋值,直接对stu操作会导致程序访问到错误的内存地址,从而出现闪回报错的问题。
解决这个问题的方法是,修改ReadInputFile函数的参数为student** stu,这样函数中就需要通过间接寻址的方式来修改stu所指向的内存,从而可以正确传递内存地址。具体实现可以参考以下代码片段:
void ReadInputFile(char* filename, student** stu)
{
FILE* fp;
fopen_s(&fp, filename, "rt");
if (!fp)
{
printf("open file error");
}
*stu = (student*)malloc(sizeof(student) * 2);
for (int i = 0; i < 2; i++)
{
fscanf_s(fp, "%s%s%s%d", (*stu)[i].Firstname, sizeof((*stu)[i].Firstname),
(*stu)[i].Lastname, sizeof((*stu)[i].Lastname),
(*stu)[i].SSN, sizeof((*stu)[i].SSN),
&(*stu)[i].number);
printf("%s\n%s\n%s\n%d\n", (*stu)[i].Firstname,
(*stu)[i].Lastname,
(*stu)[i].SSN,
(*stu)[i].number);
for (int j = 0; j < (*stu)[i].number; j++)
{
fscanf_s(fp, "%s%d%d", (*stu)[i].Arraycourse[j].name, sizeof((*stu)[i].Arraycourse[j].name),
&(*stu)[i].Arraycourse[j].ID, &(*stu)[i].Arraycourse[j].section);
printf("%s %d %d\n", (*stu)[i].Arraycourse[j].name,
(*stu)[i].Arraycourse[j].ID, (*stu)[i].Arraycourse[j].section);
}
}
fclose(fp);
}
这样,在函数外部调用ReadInputFile函数时,传递的参数即为&stu,即可正确的将内存地址传递到函数中。
你的代码就没看到strcpy,你说的是什么