这是我获取学生详情的代码。
#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”。核心(甩)。有人可以告诉我代码中有什么问题以及如何修复它?
答案 0 :(得分:1)
char fname[25];
scanf ("%s",&n.fname);
正如elsewhere所解释的那样,这似乎有效,但这是错误的。使用scanf("%s", fname);
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);
然后检查错误并妥善处理。