堆栈周围变量损坏? ç
我有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”并且是这将全部放入文件中。
如果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,我认为这是一个指向已打开文件的指针,正确读取变量。换句话说,检查文件是否正确打开,并且该文件包含您想要读取的所有数据。
'subsec'的定义是什么?是否足够大以容纳您想要阅读的整个字符串? – 2013-02-28 18:44:14
什么是输入的定义?我假设inputf是一个文件*,是否正确? – octopusgrabbus 2013-02-28 18:45:10
@octopusgrabbus'FILE *'是'inputf'; 'input'似乎是一个'int'。 – 2013-02-28 18:45:47