【问题标题】:c fscanf for ints causes segfaultc fscanf for ints 导致段错误
【发布时间】:2011-07-19 11:00:41
【问题描述】:

披露:这是家庭作业。

以下代码用于读取格式如下的命令文件:

ADD 6 6 5
ADDTERM 0 1 1
MULTIPLY 2 40

并使用给定的参数调用适当的命令。出于某种原因,虽然 ADD 和 ADDTERM 按预期工作,但在读取乘法行时出现段错误。

    int arg_1 = 0, arg_2 = 0, arg_3 = 0;

    while(fscanf(commands, "%s", command) != EOF)
    {
            if(strcmp(command, "ADDTERM") == 0)
            {
                    /*The following line runs fine!*/
                    fscanf(commands, "%d %d %d",
                                    &arg_1, &arg_2, &arg_3);
                    printf("ADDTERM, Poly: %d, Coeff: %d, Exp: %d\n",
                                    arg_1, arg_2, arg_3);
                    if(polys[arg_1] == NULL)
                    {polys[arg_1] = CreatePolynomial();}
                    AddTermToPoly(polys[arg_1], arg_2, arg_3);
            }

            else if(strcmp(command, "MULTIPLY") == 0)
            {
                    /*The following line results in a segfault*/
                    fscanf(commands, "%d %d", &arg_1, &arg_2);

                    printf("MULTIPLY, Poly: %d, Multiplier: %d\n",
                                    arg_1, arg_2);
                    MultiplyPoly(polys[arg_1], arg_2);
            }

            /*...*/  
   }

这也只是我学校的Linux服务器上的一个问题。我的家用电脑运行良好,使用“gcc 版本 4.4.5 (Ubuntu/Linaro 4.4.4-14ubuntu5)”,而我的学校使用“gcc 版本 4.1.2 20080704 (Red Hat 4.1.2-48)”

任何想法为什么会这样?感谢您的帮助!

【问题讨论】:

  • 代码运行时commands字符串的确切值是多少?
  • commands 不是字符串,而是 *FILE。这不是它应该的样子吗?
  • 如果你能发布最小的程序,让其他人重现你的错误,它总是有帮助的。
  • 可能是程序早期的某些东西损坏了内存,您是否尝试过使用仅包含乘法行的文件重新运行?
  • 字符串“command”的大小是多少?您可能忘记为“\0”留一个空格

标签: c segmentation-fault scanf


【解决方案1】:

您需要为字符串中的空末端“\0”留出空间。你对 ADDTERM 没问题,因为它比 MULTIPLY 少 1 个字母。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-20
    • 2017-03-29
    • 2015-02-09
    • 1970-01-01
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    相关资源
    最近更新 更多