堆栈周围的变量已损坏?C

堆栈周围的变量已损坏?C,c,string,variables,whitespace,corruption,C,String,Variables,Whitespace,Corruption,我有两个问题,但这是更紧迫的一个 printf("Enter the term: "); scanf("%d", &input); fprintf(inputf, "%d,", input); printf("Enter the id: "); scanf("%d", &input); fprintf(inputf, "%d,", input); printf("Enter last name: "); scanf("%s", name); fprintf(inputf, "

我有两个问题,但这是更紧迫的一个

printf("Enter the term: "); scanf("%d", &input);
fprintf(inputf, "%d,", input);

printf("Enter the id: "); scanf("%d", &input);
fprintf(inputf, "%d,", input);

printf("Enter last name: "); scanf("%s", name);
fprintf(inputf, "%s,", name);

printf("Enter first name: "); fgets(name, 15, stdin);
fprintf(inputf, "%s,", name);

printf("Enter the subject: "); scanf("%s", subsec);
fprintf(inputf, "%s,", subsec);

printf("Enter the catalog number: "); scanf("%d", &input);
fprintf(inputf, "%d,", input);
//ISSUE HERE!
printf("Enter the section: "); scanf("%s", subsec);
fprintf(inputf, "%s\n", subsec);
每当我输入所有这些信息并在最后一个变量条目上按enter键时,我会看到一个窗口,上面写着“运行时检查失败#2-变量“subsec”周围的堆栈已损坏”。我可以继续,程序几乎按照我的要求运行,但为什么会发生这种情况

我的第二部分是当我开始输入姓氏,然后想输入名字时,当我按enter键输入firstname字符串变量时,它会接受“\n”字符,显然不希望发生这种情况,但姓氏和姓氏都需要能够容纳带空格的字符串。我如何用一块石头杀死两只鸟?我使用fget允许保留空白,但它会解决我的“\n”捕获问题,但如果我将其更改回scanf,我将无法保留空白

编辑:这是subsec

char subsec[MAX_SUBSEC];
MAX_SUBSEC设置为3,正如您所看到的,我之前使用过它,但我认为第二次扫描(用于部分的扫描,而不是主题扫描)会覆盖输入SUBSEC的原始用法,我会说我错了吗?我是不被允许这样做的,所以这个问题


subject的输入将是“CSE”,section的输入将是“R01”,是的,所有这些都将被放入一个文件。

检查inputf(我认为它是指向打开文件的指针)是否正确读取变量。换句话说,检查文件是否正确打开,并且此文件是否包含您要读取的所有数据。

检查inputf(我认为它是指向打开文件的指针)是否正确读取变量。换句话说,检查文件是否正确打开,并且此文件是否包含您要读取的所有数据。

如果
MAX_SUBSEC
为3,并且您为主题或子部分输入了2个以上的字符,则会溢出堆栈上的
SUBSEC
数组并损坏堆栈帧(可能会也可能不会导致问题。您应该使用

scanf("%2s", subsec);         /* read up to two non-whitespace characters for subsec */
以确保它不会尝试在
子节中读取和存储超过2个字符(加上尾随NUL)

您可能还想添加一个

scanf("%*[^\n]");             /* discard the rest of the input line */
每次扫描后,您当前必须放弃输入行的其余部分(以防某些输入的数据超过您所需的单个数据项。您可以将两者结合使用)

scanf("%2s%*[^\n]", subsec);  /* read 2 chars and discard the rest of the line */
如果你愿意的话

要输入最多15个字符(包括NUL)的字符串,并将空格作为名/姓,请使用:

scanf(" %14[^\n]", name);     /* read up to 14 chars from the line */

这将丢弃任何前导空格(包括前一行中的换行符),然后读入
name
,但如果有人输入,则不会丢弃名称中的尾随空格(您可能希望清除它们)

scanf("%2s", subsec);         /* read up to two non-whitespace characters for subsec */
以确保它不会尝试在
子节中读取和存储超过2个字符(加上尾随NUL)

您可能还想添加一个

scanf("%*[^\n]");             /* discard the rest of the input line */
每次扫描后,您当前必须放弃输入行的其余部分(以防某些输入的数据超过您所需的单个数据项。您可以将两者结合使用)

scanf("%2s%*[^\n]", subsec);  /* read 2 chars and discard the rest of the line */
如果你愿意的话

要输入最多15个字符(包括NUL)的字符串,并将空格作为名/姓,请使用:

scanf(" %14[^\n]", name);     /* read up to 14 chars from the line */

这将丢弃任何前导空格(包括前一行中的换行符),然后读入
name
,但如果有人输入,则不会丢弃名称中的尾随空格(您可能希望清除它们).

子节的定义是什么??它足够大,可以容纳你试图读取的整个字符串吗?输入的定义是什么?我假设inputf是一个文件*,对吗?@octopusgrabbus
文件*
inputf
input
似乎是一个
int
。另外,如果你的输入字符串是's,它能工作吗关于名称中的空白,a)
fgets
和手动删除
'\n'
,b)
scanf(“%[^\n]%*c”,名称)
选择一个,不要混用。子部分的定义是什么??它足够容纳你试图读取的整个字符串吗?输入的定义是什么?我假设inputf是一个文件*,对吗?@octopusgrabbus
文件*
inputf
input
似乎是一个
int
。而且,它工作吗如果“主题”的输入字符串为空?关于名称中的空白,a)
fgets
和手动删除
'\n'
,b)
scanf(“%[^\n]]]*c”,name);
选择一个,不要混合。