分割故障核心(转储)
问题描述:
这是我获取学生详细信息的代码。分割故障核心(转储)
#include <stdio.h>
struct det{
char fname[25], lname[25], shift[10], sec[2];
int roll, clss, id;
};
int details();
int main(){
details();
getchar();
getchar();
return 0;
}
int details(){
char rl;
FILE *fp;
struct det n;
printf ("\n Enter Student Informations Below : \n\n");
printf (" First Name : ");
scanf ("%s",&n.fname);
printf (" Last Name : ");
scanf ("%s",&n.lname);
printf (" Roll : ");
scanf ("%d",&n.roll);
rl = (char) n.roll + ".txt";
fp = fopen(rl, "w");
printf (" ID : ");
scanf ("%d",&n.id);
printf (" Class : ");
scanf ("%d",&n.clss);
printf (" Shift : ");
scanf ("%s",&n.shift);
printf (" Section : ");
scanf ("%s",&n.sec);
// Works fine till here. Shows in console that segmentation fault, core dumped.
fprintf (fp, "\n Name : %s %s\n", n.fname, n.lname);
fprintf (fp, " Class : %d\n Roll : %d\n ID : %d\n", n.clss, n.roll, n.id);
fprintf (fp, " Section : %s\n Shift : %s\n", n.sec, n.shift);
fclose(fp);
printf ("\n\n Details Stored.\n\n Press Enter To Exit...");
return 0;
}
工作正常,直到标记的行。但是,然后我在控制台'Segmentation fault'上看到这条消息。核心(甩)。有人可以告诉我代码中出现了什么问题,以及如何解决它?
答
问题#1
char fname[25];
scanf ("%s",&n.fname);
正如所解释的elsewhere,这似乎工作,但它是错误的。使用scanf("%s", fname);
问题#2
rl = (char) n.roll + ".txt";
此语句不连接字符串,你大概的意思做; C中的二进制+
运算符不能像那样工作。发生了什么这里:
-
".txt"
是类型“指针char
”的表达,它指向该序列(C11 6.3.2.1p3) -
(char) n.roll
的第一元件投射的int
到较窄整数类型,char
,从而丢弃一些信息。如果需要char
,使用char
,否则记录其目的 -
(char) n.roll
是整数类型的,因此,如果它的值N是在范围[0,4],其结果是类型“指针char
”和点到阵列对象的第n个元素,否则行为是未定义 (C11 6.5.6p8) - 结果被分配给
rl
,这是char
类型的,这意味着你正在努力的指针分配给一个整数(和应该看到一个警告,说明确实如此)
如果你想安全地创建一个字符串,其中包含表“NNN.txt”,您使用字符串格式化功能,如snprintf
的字符串:
char buffer[MAXIMUM_FILENAME_SIZE];
snprintf (buffer, sizeof buffer, "%d.txt", n.roll);
然后检查错误,并适当地处理它们。
你是否通过调试器运行你的代码?或者像valgrind之类的东西? – Evert
你看过任何编译器警告吗?确保把它们全部打开,如果你不确定它们,不要忽略它们。 – Evert
至少格式化您的代码。更好的办法是尝试去理解程序出错的地方(通过使用调试器或插入调试语句),并在问题中包括这种调查的结果。 – davmac