c - 将结构数组传递给函数作为输入

标签 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++;
}

最佳答案

随着

load(guys[i]);

在您的程序中,您将 guys 数组的第 i 个元素按值传递给 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);

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

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

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

至于您在

中使用system()
system("pause");

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

另外,请注意 puts()会自动在末尾打印 \n 。因此,如果您认为合适,您可以取消 \n

你有一个小错字。

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

应该是

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

关于c - 将结构数组传递给函数作为输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51577099/

相关文章:

c++ - 如何避免不必要的数据复制?

c - 在堆上使用缓冲区而不是在堆栈上使用缓冲区的性能优势 (C)

c - C 中的匿名 union

c - c中的字符串文字

javascript - 我无法使用在同一对象内创建的方法来修改对象的属性。我正在尝试使用 foreach 然后 console.log 未定义

JavaScript 字符串转换

javascript - 按属性对对象中的列表进行分组

c++ - 一个双指针可以用c++写成两种方式吗?

c++ - 难以理解 C++ 指针语法

C 中的枚举可以使用 (*,/,&,^) 等符号吗?