【发布时间】:2020-03-20 14:16:17
【问题描述】:
我有一个三行输入文件。 第一行是整数,第二行是带空格的整数,第三行是字符串。
我必须扫描它们而不是根据整数操作字符串。
我的问题是我可以扫描整数,但是扫描字符串会导致 fclose 出现分段错误。
我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
FILE* in = fopen("be.txt", "r");
FILE* out = fopen("ki.txt", "w");
if(in==NULL){
printf("Error opening in!\n");
return -1;
}
if(out==NULL){
printf("Error opening out!\n");
return -1;
}
int brknglength, i;
fscanf(in, "%d", &brknglength);
printf("%d\n", brknglength);
int* seed[brknglength];
seed[brknglength] = malloc(sizeof(int[brknglength]));
for(i = 0; i < brknglength; i++){
if (fscanf(in, "%d", &seed[i]) != 1) {
printf("%d", i);
}
printf("%d.: %d \n", i, seed[i]);
}
char string;
fscanf(in, "%s", &string);
free(seed[brknglength]);
fclose(in);
fclose(out);
return 0;
}
导致分段错误的原因是什么?
【问题讨论】:
-
char string;只是一个字符。fscanf(in, "%s", &string);需要一个足够大的数组,在这种情况下它应该是fscanf(in, "%s", string);而没有&运算符。 -
int* seed[brknglength]; seed[brknglength] = malloc(sizeof(int[brknglength]));是错误的。只使用int seed[brknglength];并删除free(seed...);。 -
我认为您应该将
int* seed[brknglength]更改为int seed[brknglength]。否则,您将得到一个未初始化的指针数组,您在技术上使用fscanf对每个指针进行初始化(很可能其值未指向程序中正确分配的内存块)。 -
与大多数高级语言不同,C 没有内置的字符串类型。在你的 C 编程书中学习字符串。
标签: c file segmentation-fault scanf