#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char line[80];
FILE *in = fopen("spooky.csv", "r");
FILE *file1 = fopen("ufos.csv", "w");
FILE *file2 = fopen("disappearances.csv", "w");
FILE *file3 = fopen("others.csv", "w");
while (fscanf(in, "%79[^\n]\n", line) == 1) {
if (strstr(line, "UFO"))
fprintf(file1, "%s\n", line);
else if (strstr(line, "Disappearance"))
fprintf(file2, "%s\n", line);
else
fprintf(file3, "%s\n", line);
}
fclose(file1);
fclose(file2);
fclose(file3);
return 0;
}
此代码返回分段错误的运行时错误。
我在什么硬件上编译这个程序有关系吗?我正在使用Fedora 38(工作站)与英特尔酷睿i7(第7代)。
1条答案
按热度按时间z9smfwbn1#
问题与
fscanf
无关:如错误消息所示,内部函数__vfscanf_internal
的参数s
具有值0x0
,指示为FILE *
参数传递的空指针。您应该检查
fopen
是否无法打开文件,并使用有意义的错误消息报告此情况。还要注意这些备注:
in
。fgets()
而不是fscanf()
。fscanf
将无法转换spooky.csv中的初始空行,如果它是一个实际的CSV文件,则不应发生这种情况。\n
将导致新行与下一行中的任何初始白色空格一起被沿着,这可能不是预期的。使用%79[^\n]%*[\n]
来避免这种情况,但要消耗后续的空行。以下是修改后的版本: