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