堆栈周围变量损坏? ç

问题描述:

我有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”周围的堆栈已损坏。“我可以继续下去,程序几乎可以做我想做的事情,但为什么会发生这种情况?

我的第二个部分是当我在进入最后一个名称,然后想进入的第一个名字,它发生在当我按下了名字字符串变量输入,显然不希望这种事情发生在“\ n”字符,但名字和姓氏都需要能够用空格保存字符串。我怎样用一块石头杀死两只鸟?我使用fget来允许我保留空格,但是它会出现我的“\ n”捕获问题,但是如果我将其更改回scanf,我不能保留空格!

编辑:这是subsec

char subsec[MAX_SUBSEC]; 

MAX_SUBSEC设定为三,我用它之前,你可以看到,但我想第二个scanf函数(一个为部分,不受)会写在原来使用输入subsec,我要说我错了?我不允许这样做,因此问题...

对于主题的输入将是“CSE”,并且节的输入将是“R01”并且是这将全部放入文件中。

+3

'subsec'的定义是什么?是否足够大以容纳您想要阅读的整个字符串? – 2013-02-28 18:44:14

+0

什么是输入的定义?我假设inputf是一个文件*,是否正确? – octopusgrabbus 2013-02-28 18:45:10

+0

@octopusgrabbus'FILE *'是'inputf'; 'input'似乎是一个'int'。 – 2013-02-28 18:45:47

如果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,但是如果有人输入这些空格,则不会丢弃该名称的尾部空格(您可能需要清除它们)。

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