【问题标题】:C programming - segmentation fault (core dump)C 编程 - 分段错误(核心转储)
【发布时间】:2017-11-10 22:13:07
【问题描述】:

每次运行它时,我都会不断收到段错误(核心转储),无论我更改了什么或编译正常!不知道我在哪里犯了错误?有什么建议吗?

int main (int argc, char** argv)
{
    FILE *output;
    if ((output = fopen("output", "w")) == NULL)
    {
            printf ("cannot open the file input\n");
            exit (EXIT_FAILURE);
    }

    int data = 1;
    while (scanf("%d", data) > 0)
    {
            print(output, data);
    }

    fclose(output);
    return (0);
}
void print(FILE* output, int data)
{
    fprintf(output, "%d\n", data);
    return;
}

【问题讨论】:

  • scanf 期望地址scanf("%d", &data)

标签: c segmentation-fault coredump


【解决方案1】:

首先,正如之前有人说的,你需要将一个变量的地址传递给scanf函数,所以它看起来像这样:

    scanf("%d", &data)

但是像你一样在 while 循环中使用它不会正常工作,因为 scanf 不会返回你分配给变量的值。 你必须像这样使用它:

   while(data > 0)
   {
       scanf("%d", &data);
       print(output, data);
   }

在这种情况下,我认为 do-while 循环比 while 循环更合适:

   do
   {
       scanf("%d", &data);
       print(output, data);
   } while (data > 0);

这样它就会按照您期望的方式工作。

您还忘记指定输出文件的文件类型:

    if ((output = fopen("output", "w")) == NULL)

应该是

    if ((output = fopen("output.txt", "w")) == NULL)

我在这里为你发布了一个完整的解决方案:https://pastebin.com/vpK9i6Wk

【讨论】:

    【解决方案2】:

    1 将while (scanf("%d", data) > 0) 更改为while (scanf("%d", &data) > 0)

    2将print的函数移到开头。

    这可能对你有用。

    #include <stdio.h>
    #include <string.h>
    #define MAX 100
    
    void print(FILE* output, int data)
    {
        fprintf(output, "%d\n", data);
        return;
    }
    
    int main (int argc, char** argv)
    {
        FILE *output;
        if ((output = fopen("output", "w")) == NULL)
        {
                printf ("cannot open the file input\n");
                return -1;
        }
    
        int data = 1;
        while (scanf("%d", &data) > 0)
        {
                print(output, data);
        }
    
        fclose(output);
        return (0);
    }
    

    输入

    1 2 3 “回车” “Ctrl+D”

    【讨论】:

    • 我认为这有帮助,但它仍然不会打印到输出文件。关于原因有什么建议吗?
    • @mega.rose 您应该使用“Ctrl + D”来完成输入。我编辑我的答案以添加输入示例。
    【解决方案3】:
    while (scanf("%d", data) > 0)
    

    应该改为

    while (scanf("%d", &data) > 0)
    

    由于 scanf 期望传递变量的地址而不是变量本身,如果你传递一个变量,scanf 将通过考虑你传递的值作为内存地址来访问错误的内存,这将导致未定义的行为

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-14
      • 2022-01-14
      • 2017-02-25
      • 2016-07-12
      • 2018-03-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多