-1

宿題用の C アプリを開発していますが、迷惑なクラッシュに直面しています。これが私のコードです:

#include <stdio.h>
#include <stdlib.h>

//Constants
//Available user choices
enum commands {READ_LIST = 1, QUIT};

struct student {
    char* surname;
    char* name;
    char* group;
};

typedef struct student Student;
typedef Student * studentPtr;

//Globals
int studentCount = 0;

//Function declarations
void displayCommands();
void readList();

//Main function
int main() {

    char enteredValue[999];
    int thisCommand;
    int running = 1;

    while(running) {
        displayCommands();
        scanf("%s", enteredValue);
        thisCommand = atoi(enteredValue);
        puts("\n----------------------------------------------");
        switch(thisCommand) {
            case READ_LIST:
                readList();
                break;
            case QUIT:
                running = 0;
                break;
            default:
                puts("Wrong command!");
                break;
        }
    }
    system("pause");
    return 0;
}

void displayCommands() {
    puts("\n---------------------------------------------");
    puts("Enter a command number:");
    printf("%d - Read students from file.\n", READ_LIST);
    printf("%d - Quit.\n", QUIT);
    puts("----------------------------------------------");
}

void readList() {
    FILE *fp = NULL;

    fp = fopen("studs.txt", "r");

    studentPtr newStudentPtr = malloc(sizeof(Student));

    if(fp != NULL) {
        fscanf(fp, "%d", &studentCount);

        if(newStudentPtr != NULL) {
            fscanf(fp, "%s %s %s", newStudentPtr->surname,
                   newStudentPtr->name, newStudentPtr->group);
        }
        fclose(fp);
    } else {
        puts("Unable to open file for reading!");
    }
}

基本的に、整数 ant 3 つの文字列を構造体に読み込もうとします。ファイルの最後の行を読み取ろうとすると、プログラムがクラッシュします。

何か助けてください。私はどんな間違いを犯していますか?

前もって感謝します!

4

2 に答える 2

4

任意のメモリ アドレスに読み込むことはできません。学生構造体にメモリを割り当てた後、各文字列にもメモリを割り当てる必要があります。大雑把に:

    if(newStudentPtr != NULL) {
        char buffer[3][256];
        fscanf(fp, "%s %s %s", buffer[0], buffer[1], buffer[2]);
        newStudentPtr->surname = malloc(strlen(buffer[0])+1);
        strcpy(newStudentPtr->surname, buffer[0]);
        newStudentPtr->name = /* similar ... */;
        newStudentPtr->group = /* similar ... */;
    }
于 2013-04-14T15:37:16.077 に答える
1

struct student(char ポインタの代わりに) char の配列を含むように変更できます。

struct student {
    char surname[100];
    char name[100];
    char group[100];
};
于 2013-04-14T15:43:17.877 に答える