C 断开文件时出现分段错误(核心转储)

C 断开文件时出现分段错误(核心转储),c,C,我正试图编写一个程序,将一个包含公司名称和电话号码的文件拆分为名称、区号和电话号码。我的问题是,每当我尝试运行该程序时,就会出现错误分段错误(内核转储)。我试着在指针上使用malloc,但似乎不起作用 # include <stdio.h> # include <stdlib.h> # include <string.h> typedef struct { char name[30]; char areacode[10]; char p

我正试图编写一个程序,将一个包含公司名称和电话号码的文件拆分为名称、区号和电话号码。我的问题是,每当我尝试运行该程序时,就会出现错误分段错误(内核转储)。我试着在指针上使用malloc,但似乎不起作用

# include <stdio.h>
# include <stdlib.h>
# include <string.h>
typedef struct {
    char name[30];
    char areacode[10];
    char phone[14];
} phone_numbers;

int ReadNumber(phone_numbers *phone) {

    FILE *input = fopen("phone_numbers.txt", "r");

    char length[200];
    char *temp;
    int i;

    if (input == NULL) {

         printf("File can not open");
    }
    while (fgets(length, sizeof(length), input) != NULL) {
        temp = strtok(length, " ");
        strcpy(phone[i].name, temp);

        temp = strtok(NULL, "-");
        strcpy(phone[i].areacode, temp);

        temp = strtok(NULL, "\n");
        strcpy(phone[i].phone, temp);

        i++;
    }
    fclose(input);
    return i;
}



void PrintNumbers (phone_numbers *phone, int i) {
    int j;

    for(j=0; j <= i; j++) {

        printf("Business: %s Area code: %s Phone: %s \n", phone[i].name, phone[i].areacode, phone[i].phone);
    }
    return;
}

int main() {

    phone_numbers phone[10];
    int i;

    i = ReadNumber(phone);

    PrintNumbers(phone, i);


    return 0;
}
#包括
#包括
#包括
类型定义结构{
字符名[30];
字符区域码[10];
字符电话[14];
}电话号码;
int ReadNumber(电话号码*电话){
FILE*input=fopen(“phone_numbers.txt”、“r”);
字符长度[200];
字符*温度;
int i;
如果(输入==NULL){
printf(“文件无法打开”);
}
while(fgets(长度,sizeof(长度),输入)!=NULL){
温度=strtok(长度“”);
strcpy(电话[i]。姓名,临时工);
温度=strtok(空,“-”;
strcpy(电话[i]。区号,温度);
temp=strtok(空,“\n”);
strcpy(phone[i]。phone,temp);
i++;
}
fclose(输入);
返回i;
}
无效打印号码(电话号码*电话,int i){
int j;

对于(j=0;j错误的原因是您没有在
ReadNumber()
函数中初始化
i


另外,您应该始终检查
strtok()
是否返回
NULL
错误原因是您没有在
ReadNumber()
函数中初始化
i


另外,您应该始终检查
strtok()
是否返回
NULL

您可以先检查以确保
strtok
没有返回空指针。如果在GCC或Clang中打开
-Wall-Wextra
标志(或其他编译器中的类似警告标志),将提示您在
ReadNumber
函数中初始化
i
。您可以首先检查以确保
strtok
没有返回空指针。如果您在GCC或Clang中打开
-Wall-Wextra
标志(或其他编译器中的类似警告标志),系统将提示您在
ReadNumber
函数中初始化
i