将结构数组传递给输入函数

时间:2018-07-29 04:02:26

标签: c arrays pointers struct

我正在开发一个C语言程序,该程序为员工收集姓名,费率和工时等数据。事情是我需要使用struct

我正在尝试将结构数组传递到load()函数中,用户将在其中输入员工的姓名,工作时间和薪资水平,但看来我做错了。你能告诉我怎么了吗?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define size 3
int i = 0;
struct Employee
{
    char name[20];
    float rate;
    float hours;

}employee;


void load(struct Employee *guys);
void printout();
void edit();
void realedit();
void print();

int main(void)
{   
    int x=0;
    struct Employee guys[size];


    while (x != 5)
    {
        printf("Main Menu\n");
        printf("1. Add Employee\n");
        printf("2. Edit Employee\n");
        printf("3. Print Employee\n");
        Printf("4. Print All Employees\n");
        printf("5. Quit");
        scanf_s("%d", &x);

        switch (x) 
        {
        case 1: load(guys[i]);
            break;


        default: printf("Please enter valid option.\n\n");
            break;
        }
    }


    system("pause");
    return 0;

}

void load(struct Employee *guys)
{
    puts("\ntype name:\n");
    scanf_s("%s", &guys[i]->name, 20);

    puts("\ntype hourly rate:\n");
    scanf_s("%f", &guys[i]->rate);

    puts("\ntype hours worked:\n");
    scanf_s("%f", &guys[i]->hours);


    i++;
}

1 个答案:

答案 0 :(得分:4)

使用

import os
from django.db import models
from django.utils.translation import gettext, gettext_lazy as _
from utils.validators import validate_file_extension
from utils.generic import content_file_name
from users.models import User
# Create your models here.

class Users(models.Model):
    owner = models.ForeignKey(User, verbose_name='published by', on_delete=models.CASCADE)
    name = models.CharField(_('name'), max_length=140)
    file = models.FileField(_('file'), upload_to=content_file_name,
                            validators=[validate_file_extension])
    type = models.CharField(max_length=5, editable=False, blank=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        verbose_name_plural = _('My users')

    def __str__(self):
        return self.name

    def save(self, *args, **kwargs):
        ext = os.path.splitext(self.file.name)[1]
        if ext:
            self.type = ext
        try:
            model = Users.objects.get(id=self.id)
            if self.file != model.file:
                model.file.delete()
        except: pass
        return super(Users, self).save(*args, **kwargs)

在您的程序中,您正在按值将load(guys[i]); 数组的第i个元素传递给guys。因此,load()中使用的实际上是一个副本更改,不会影响到load()中的原始值。

相反,您可以像这样将指向第main()个元素的指针传递到i

load()

并使用load(&guys[i]); 运算符访问->内部的变量。

struct

因为我们一一处理元素,所以无需使用void load(struct Employee *guys) { puts("\ntype name:\n"); scanf_s("%s", guys->name, 20); puts("\ntype hourly rate:\n"); scanf_s("%f", guys->rate); puts("\ntype hours worked:\n"); scanf_s("%f", guys->hours); } 进行索引。


[i]

该函数需要数组的基地址。所以用

scanf_s("%s", &guys[i]->name, 20);

随着数组名称衰减为指向数组第一个元素的指针。

关于您在{p>中使用scanf_s("%s", guys[i]->name, 20);

system()

考虑阅读 Why should the system() function be avoided in C and C++?

此外,请注意,puts()将在末尾自动打印system("pause"); 。因此,如果您认为合适,则可以取消使用\n

您有一个小错字。

\n

应该已经

Printf("4. Print All Employees\n");