C 编程 - 段错误(核心转储)

C programming - segmentation fault (core dump)

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

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;
}
while (scanf("%d", data) > 0)

应该改为

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

由于 scanf 期望传递的是变量地址而不是变量本身,如果传递变量,scanf 会将传递的值视为内存地址,最终访问错误的内存,这将导致未定义的行为

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 "Enter" "Ctrl+D"

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

    scanf("%d", &data)

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

   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