2

ユーザーから従業員情報を取得してファイルに書き込もうとしていますが、segmentation fault従業員名を入力した後に取得しました。これは私のコードです。

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

struct record_em{
    int id;
    char name[20];
    int salary;
    int age;
};

int main( void )
{
    struct record_em employee;
    FILE *fp;
    int id, salary, age;
    char name[20];
    int n=1;

    fp = fopen("empRecord.dat","a");
    while(n==1){
        printf("\nEnter Employee ID\n");
        scanf("%d",&id);
        employee.id=id;
        printf("\nEnter Employee Name\n");
        scanf("%s",name);
        employee.name=name;
        printf("\nEnter Employee Salary\n");
        scanf("%d",&salary);
        employee.salary=salary;
        printf("\nEnter Employee Age\n");
        scanf("%d",&age);
        employee.age=age;
        fwrite(&employee,sizeof(employee),1,fp);
        printf("Enter 1 to add new record \n");
        scanf("%d",&n);
    }

    fclose(fp);

    return 0;
    }

出力(コメントから取得):

Fatmahs-MacBook-Air:~ fatmah$ gcc -o em em.c
Fatmahs-MacBook-Air:~ fatmah$ ./em
従業員IDを入力してください
88
従業員名を入力
うーん
セグメンテーション違反: 11
4

3 に答える 3

6

変化する

scanf("%s",name);
employee.name=name;

scanf("%s",name);
strcpy(employee.name, name);

Dukeling & hmjd が示唆するように、さらに良い

scanf("%19s", employee.name);
于 2012-11-23T10:11:52.117 に答える
3

ここに 1 つの大きな問題があります。

scanf("%s",name);
employee.name=name;

メンバーname配列です。割り当てることはできません。代わりに使用strcpyしてコピーします。

于 2012-11-23T10:11:32.920 に答える
0
  1. typedef 構造体を作成record_tして、物事を短く理解しやすくします。

    typedef struct {
        int id;
        char name[20];
        int salary;
        int age;
    } record_t;
    
  2. ファイルを作成し、最初にフォーマットします。

    void file2Creator( FILE *fp )
    {
        int i; // Counter to create the file.
        record_t data = { 0, "", 0, 0 }; // A blank example to format the file.
    
        /* You will create 100 consecutive records*/
        for( i = 1; i <= 100; i++ ){
            fwrite( &data, sizeof( record_t ), 1, fp );
        }
    
        fclose( fp ); // You can close the file here or later however you need.  
    }
    
  3. ファイルを埋める関数を書きます。

    void fillFile( FILE *fp )
    {
        int position;
        record_t data = { 0, "", 0, 0 };
    
    
        printf( "Enter the position to fill (1-100) 0 to finish:\n?" );
        scanf( "%d", &position );
    
        while( position != 0 ){
            printf( "Enter the id, name, and the two other values (integers):\n?" );
            fscanf( stdin, "%d%s%d%d", &data.id, data.name, data.salary, data.age );
    
            /* You have to seek the pointer. */
            fseek( fp, ( position - 1 ) * sizeof( record_t ), SEEK_SET );
            fwrite( &data, sizeof( record_t ), 1, fp );
            printf( "Enter a new position (1-100) 0 to finish:\n?" );
            scanf( "%d", &position );
        }
    
        fclose( fPtr ); //You can close the file or not, depends in what you need.
    }
    

これを参照として使用できます2 つのファイルの列を比較して確認する

于 2012-11-23T10:38:32.653 に答える