Ошибка сегмента, когда вызывается функция для ввода двойного в член массива, предыдущий ввод работает - PullRequest
0 голосов
/ 06 мая 2019

Для назначения класса в C мне было поручено написать программу, которая создает структуру с 4 членами, именем, фамилией, часами и выплатой, после ее создания она вводит пользователя для ввода 4 членов. 3раз, поэтому у нас есть 3 сотрудника.когда программа запущена, я могу ввести первый и последний и часы первого сотрудника, но когда дело доходит до ввода для ставки выплаты, это вызывает ошибку сегментации.Вот мой код

#include <stdio.h>
#include <stdlib.h>
#define SIZE 3

struct employee
{
    char first[30];
    char last[30];
    double hours;
    double payrate;
};

typedef struct employee emp; 

int main(void)
{
    system("clear");

    emp emp[SIZE];

    int counter;

    for (counter = 0; counter < 3; counter++)
    {
        input(&emp[counter]);
    }

    for (counter = 0; counter < 3; counter++)
    {
        output(emp[counter]);
    }       

    printf("%10s %10s %10s %10s", "First", "Last", "Hours", "Rate");
    puts("------------------------");

    for (counter = 0; counter < SIZE; counter++)
    {
        printf("%s %s %d %d \n", emp[30].first, emp[30].last, emp[10].hours, emp[10].payrate);
    }

    return 0;
}

void output(struct employee emp)
{
    printf("First: %s \n", emp.first);
    printf("Last: %s \n", emp.last);
    printf("Hours: %d \n", emp.hours);
    printf("Payrate: %d \n", emp.payrate);
    puts("********************************");
}

void input(emp * ptr)
{
    printf("Enter first name: ");
    scanf("%s", ptr->first);

    printf("Enter last name: ");
    scanf("%s", ptr->last);

    printf("Enter hours worked: ");
    scanf("%d", ptr->hours);

    printf("Enter payrate: ");
    scanf("%d", ptr->payrate);

    puts("********************************");
}

Редактировать # 1 Я редактировал некоторый код, и он работает до части таблицы, теперь он работает, но выдает 0,0000 в первых двух столбцах таблицы, здесь отредактированныйкод.

#include <stdio.h>
#include <stdlib.h>
#define SIZE 3

struct employee
{
    char first[30];
    char last[30];
    double hours;
    double payrate;
};

typedef struct employee emp; 

int main(void)
{
    system("clear");

    emp emp[SIZE];

    int counter;

    for (counter = 0; counter < SIZE; counter++)
    {
        input(&emp[counter]);
    }

    for (counter = 0; counter < SIZE; counter++)
    {
        output(emp[counter]);
    }       

    printf("%10s %10s %10s %10s", "First", "Last", "Hours", "Rate");
    puts("\n ------------------------");

    for (counter = 0; counter < SIZE; counter++)
    {
        printf("%s %s %lf %lf \n", emp[30].first, emp[30].last, emp[10].hours, emp[10].payrate);
    }

    return 0;
}

void output(struct employee emp)
{
    printf("First: %s \n", emp.first);
    printf("Last: %s \n", emp.last);
    printf("Hours: %f \n", emp.hours);
    printf("Payrate: %f \n", emp.payrate);
    puts("********************************");
}

void input(emp * ptr)
{
    printf("Enter first name: ");
    scanf("%s", ptr->first);

    printf("Enter last name: ");
    scanf("%s", ptr->last);

    printf("Enter hours worked: ");
    scanf("%lf", &ptr->hours);

    printf("Enter payrate: ");
    scanf("%lf", &ptr->payrate);

    puts("********************************");
}

1 Ответ

4 голосов
/ 06 мая 2019

Первая проблема заключается в том, что вторым аргументом для scanf должен быть указатель. В случае с вашими строками они являются массивами и в любом случае рассматриваются как указатели, поэтому они работают нормально. Вы должны использовать оператор &, чтобы дать ему адрес двойников. Следующая проблема заключается в том, что спецификатор преобразования "% d" предназначен для целочисленного преобразования со знаком. Для двойника используйте "% lf", так как двойное число является длинным плавающим.

Пример:

scanf("%lf", &ptr->hours);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...