堆栈变量损坏? C

时间:2013-02-28 18:43:16

标签: c string variables whitespace corruption

我有2个问题,但这是更紧迫的问题......

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);

每当我输入所有这些信息并按下最后一个变量条目上的回车时,我会得到一个窗口,上面写着“运行时检查失败#2 - 变量'subsec'周围的堆栈已损坏。”我可以继续,该程序几乎完成了我想要的工作,但为什么会发生这种情况?

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

编辑:这是subsec

char subsec[MAX_SUBSEC];

MAX_SUBSEC设置为3,我之前使用它你可以看到,但是我想第二个scanf(一个用于section,不是subject)会写入输入subsec的原始用法,我会说我错了?我不被允许这样做,因此问题......

主题的输入将是“CSE”,而部分的输入将是“R01”,是的,这将全部放入文件中。

2 个答案:

答案 0 :(得分:3)

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

scanf("%2s", subsec);         /* read up to two non-whitespace characters for subsec */

确保它不会尝试读取并存储超过2个字符(加上尾随的NUL)到subsec

您可能还想添加

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,但如果有人输入它们,则不会丢弃名称中的尾随空格(您可能希望清除它们) )。

答案 1 :(得分:0)

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