这是我获取学生详细信息的代码。
#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;
}
工作正常,直到标记线为止。但后来我在控制台上收到此消息“段错误”。核心(已转储)。有人可以告诉我代码中有什么问题以及如何修复它吗?
最佳答案
问题#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
转换为更窄的 integer 类型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);
然后检查错误并进行适当处理。
关于c - 分段故障核心(已转储),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40562790/