【问题标题】:Stack around variable corrupted? C堆栈周围的变量损坏? C
【发布时间】:2013-02-28 18:43:15
【问题描述】:

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

每当我输入所有这些信息并在最后一个变量条目上按 Enter 键时,我都会看到一个窗口显示“运行时检查失败 #2 - 变量 'subsec' 周围的堆栈已损坏。”我可以继续,程序几乎可以按照我的意愿运行,但为什么会发生这种情况?

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

编辑:这是亚秒

char subsec[MAX_SUBSEC];

MAX_SUBSEC 设置为 3,如您所见,我以前使用它,但我认为第二个 scanf(用于部分,而不是主题)会覆盖输入 subsec 的原始使用,我会说我错了?而且我不允许这样做,因此问题...

主题的输入将是“CSE”,部分的输入将是“R01”,是的,这一切都将被放入一个文件中。

【问题讨论】:

  • subsec的定义是什么?它是否足以容纳您要读取的整个字符串?
  • 输入的定义是什么?我假设 inputf 是一个 FILE *,对吗?
  • @octopusgrabbus FILE*inputf; input 似乎是 int
  • 另外,如果您的“主题”输入字符串为空,它是否有效?
  • 关于名称中的空格,a)fgets 和手动删除'\n',b)scanf("%[^\n]%*c",name); 选择一个,不要混用。

标签: c string variables whitespace corruption


【解决方案1】:

如果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 之后,您当前必须丢弃输入行的其余部分(以防某些输入的数据项超过您想要的单个数据项。您可以将两者结合起来

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2012-11-08
      • 2013-07-28
      • 2012-11-05
      • 1970-01-01
      • 2018-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多