>

친구의 컴퓨터에서 잘 작동하는 프로젝트에 대해 일부 코드를 실행하려고하는데 실행하려고하면 분할 오류 오류가 발생합니다.

이것은 우리에게 제공된 주요 파일입니다 :

EMPLOYEE_LIST.C

#include "libel.h"
#include <stdio.h>
#include <string.h>
int main() {
    const char *filename = "directory.txt";
    char *csv_prefix = "csv_list";
    char find_name[25];
    pi person;
    el emp_list;
    emp_list.num_people = 0;
    load_el(&emp_list, filename);
    printf("%d employees loaded.\n", emp_list.num_people);
    char cont = 'x', // initialize continue to something other than 'Y' or 'N'
        tmp;         //
    int state = -1, correct_search_val;
    char srch_critera[25] = "init";
    while (state != 4) {
        while (state < 1 || state > 4) {
            printf("1:\tAdd employee and salary\n");
            printf("2:\tSearch directory by first name\n");
            printf("3:\tGenerate CSV\n");
            printf("4:\tSave and exit program\n");
            printf("Enter an option (1-4): ");
            scanf("%d", &state);
            if (state < 1 || state > 4) {
                printf("\nError: number not in range\n\n");
            }
        }
        switch (state) {
        // add employee and salary
        case 1:
            // add one person
            printf("Enter a first name: ");
            scanf("%s", person.first);
            printf("Enter %s's last name: ", person.first);
            scanf("%s", person.last);
            printf("Enter %s's occupation: ", person.first);
            scanf("%s", person.position);
            printf("Enter %s's Salary: ", person.first);
            scanf("%lf", &person.salary);
            scanf("%c", &tmp);
            printf("Employee added.\n");
            add_person(&emp_list, person);
            // determine to add more people to the employee list
            while (cont != 'N' && emp_list.num_people < MAXPPL) {
                cont = 'x';
                while (cont != 'Y' && cont != 'N') {
                    printf("Would you like to enter another name (Y/N): ");
                    scanf("%c", &cont);
                    if (cont != 'Y' && cont != 'N') {
                        printf(
                            "Error: User entered '%c'. Must enter either 'Y' "
                            "or 'N'\n",
                            cont);
                    }
                    scanf("%c", &tmp);
                }
                if (cont != 'N') {
                    printf("Enter a first name: ");
                    scanf("%s", person.first);
                    printf("Enter %s's last name: ", person.first);
                    scanf("%s", person.last);
                    printf("Enter %s's occupation: ", person.first);
                    scanf("%s", person.position);
                    printf("Enter %s's Salary: ", person.first);
                    scanf("%lf", &person.salary);
                    scanf("%c", &tmp);
                    printf("Employee added.\n");
                    add_person(&emp_list, person);
                }
            }
            printf("\nReturning to main menu...\n\n");
            state = -1;
            break;
        // search directory by first name
        case 2:
            cont = 'x'; // reset continue to neither 'Y' nor 'N'
            while (cont != 'N') {
                cont = 'x';
                printf("Enter a person's name to search for: ");
                scanf("%s", find_name);
                scanf("%c", &tmp);
                search_el(emp_list, find_name);
                while (cont != 'Y' && cont != 'N') {
                    printf("\nContinue (Y/N)? ");
                    scanf("%c", &cont);
                    fflush(stdout); //, &tmp);
                    scanf("%c", &tmp);
                    if (cont != 'Y' && cont != 'N') {
                        printf(
                            "Error: User entered '%c'. Must enter either 'Y' "
                            "or 'N'.\n",
                            cont);
                    }
                }
            }
            printf("\nReturning to main menu...\n\n");
            state = -1;
            break;
        // generate CSV file
        case 3:
            correct_search_val = -1;
            while (correct_search_val != 0) {
                printf("Generate CSV based on? (\"Salary\", \"Position\"): ");
                scanf("%s", srch_critera);
                if (!strcmp(srch_critera, "Salary")) {
                    printf("Generating CSV based on salary...\n");
                    gen_csv_sal(&emp_list);
                    correct_search_val = 0;
                } else if (!strcmp(srch_critera, "Position")) {
                    printf("Generating CSV based on position...\n");
                    gen_csv_pos(&emp_list);
                    correct_search_val = 0;
                } else
                    printf("Options are: \"Salary\", \"Position\"\n");
            }
            printf("Returning to main menu...\n\n");
            state = -1;
        case 4:
            break;
        } // end switch
    }    // end while
    // save the employee list
    save_el(&emp_list, filename);
    printf("%d employees saved.\n", emp_list.num_people);
    return 0;
} // end main

위 코드에 기능을 추가하기 위해 생성해야하는 파일은 다음과 같습니다.

LIBEL.C

#include "libel.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// ADD FUNCTION DEFINITIONS FOR LOAD_EL, SAVE_EL, ADD_PERSON, AND SERACH_EL HERE
void load_el(el *emp_list, const char *filename) {
    FILE *ifp;
    ifp = fopen(filename, "r");
    fscanf(ifp, "%d", &emp_list->num_people);
    for (int i = 0; i < emp_list->num_people; i++) {
        fscanf(
            ifp,
            "%s %s %s %lf",
            emp_list->people[i].first,
            emp_list->people[i].last,
            emp_list->people[i].position,
            &emp_list->people[i].salary);
    }
    fclose(ifp);
    return;
}
void add_person(el *emp_list, pi person) {
    emp_list->people[emp_list->num_people] = person;
    emp_list->num_people++;
    return;
}
void search_el(el emp_list, char find_name[]) {
    int count = 0;
    for (int i = 0; i < emp_list.num_people; i++) {
        if (strcmp(emp_list.people[i].first, find_name) == 0) {
            printf(
                "\nName: %s %s\nPosition: %s\nSalary: %lf\n",
                emp_list.people[i].first,
                emp_list.people[i].last,
                emp_list.people[i].position,
                emp_list.people[i].salary);
            count++;
        }
    }
    if (count == 0) {
        printf("No entries with that name.\n");
    }
    return;
}

LIBEL.H

#ifndef _LIBCL_H_
#define _LIBCL_H_
#define MAXPPL 500
#define MAXLEN 25

struct personal_info {
    char first[MAXLEN];
    char last[MAXLEN];
    char position[MAXLEN];
    double salary;
};
typedef struct personal_info pi;

struct employee_list {
    pi people[MAXPPL];
    int num_people;
};
typedef struct employee_list el;

//ADD PROTOTYPES HERE
void load_el(el * emp_list, const char * filename);
void add_person(el * emp_list, pi person);
void search_el(el emp_list, char find_name[ ]);
void save_el(el * emp_list, const char * filename);
void gen_csv_sal(el * emp_list);
void gen_csv_pos(el * emp_list);
char * gen_file_name(char * filename, int filename_size, char * suffix, int suffix_size);
#endif

디버거를 통해 코드를 실행했는데 다음 오류가 발생했습니다.

프로그램 수신 신호 SIGSEGV, 세그먼트 오류.
isoc99_fscanf.c에서 __isoc99_fscanf (스트림 = 0x0, 형식 = 0x401fa2 "% d") : c : 30
30 isoc99_fscanf.c : 그러한 파일이나 디렉토리가 없습니다.

이전에 디버거를 사용해 본 적이 없으며 이것이 무엇을 의미하는지 전혀 알지 못하므로 설명이 좋을 것입니다.

친구가 아무 문제없이 컴파일하고 실행할 수 있으므로 모든 것이 잘 작동해야합니다. "gcc employee_list.c libel.c"로 컴파일 한 후 "./a.out"으로 터미널에서 코드를 실행하려고 할 때 "세그먼트 결함"이외의 다른 종류의 오류가 발생하지 않습니다. 정확히 문제가 무엇인지 확인하십시오. 기본 터미널을 사용하는 가상 민트 Linux 시스템에서 VMware 워크 스테이션을 사용하고 있습니다. 위에 나열된 것과 동일한 방식으로 동일한 설정을 사용하고 컴파일합니다.

나는 프로그래밍에 대한 완전한 초보자이므로 이것에 대한 도움을 주시면 감사하겠습니다.

  • 답변 # 1

    "directory.txt"파일의 형식이 둘 다 정확히 동일하지 않을 수도 있습니다.

    fscanf의 입력이 0 (NULL) 인 것 같습니다 :

    와이즈 비즈

    또한 안전하지 않습니다 :

    Program received signal SIGSEGV, Segmentation fault. __isoc99_fscanf (stream=0x0, format=0x401fa2 "%d") at isoc99_fscanf.c:30 30 isoc99_fscanf.c: No such file or directory.

    다음과 같이 해보십시오 :

    ifp = fopen(filename, "r");
    fscanf(ifp, "%d", &emp_list->num_people);
    
    

    도움이 되길 바랍니다!

    void load_el(el *emp_list, const char *filename) { FILE *ifp; ifp = fopen(filename, "r"); if(0 == ifp) { printf("File not found!\n"); return; } fscanf(ifp, "%d", &emp_list->num_people);

  • 이전 java - 64/32 비트 JVM 버전이 모두 설치된 경우 JNLP 애플리케이션은 JVM의 올바른 비트 버전을 어떻게 선택합니까?
  • 다음 orm - 라 라벨 웅변 - 피벗 테이블과의 모델 관계