将struct数组传递给输入函数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将struct数组传递给输入函数相关的知识,希望对你有一定的参考价值。
我正在研究一种用C语言编写的程序,它为员工收集名称,费率和工时等数据。问题是我需要使用struct
。
我试图将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
");
printf("1. Add Employee
");
printf("2. Edit Employee
");
printf("3. Print Employee
");
Printf("4. Print All Employees
");
printf("5. Quit");
scanf_s("%d", &x);
switch (x)
{
case 1: load(guys[i]);
break;
default: printf("Please enter valid option.
");
break;
}
}
system("pause");
return 0;
}
void load(struct Employee *guys)
{
puts("
type name:
");
scanf_s("%s", &guys[i]->name, 20);
puts("
type hourly rate:
");
scanf_s("%f", &guys[i]->rate);
puts("
type hours worked:
");
scanf_s("%f", &guys[i]->hours);
i++;
}
答案
随着
load(guys[i]);
在你的程序中,你将i
数组的guys
th元素按值传递给load()
。因此,在load()
中使用的实际上是一个副本更改,它不会影响main()
中的原始值。
相反,你可以将指向i
th元素的指针传递给load()
load(&guys[i]);
并使用->
运算符访问struct
中的变量。
void load(struct Employee *guys)
{
puts("
type name:
");
scanf_s("%s", guys->name, 20);
puts("
type hourly rate:
");
scanf_s("%f", guys->rate);
puts("
type hours worked:
");
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()
将在结尾处自动打印
。所以,如果你认为合适,你可以取消
。
你有一个小错字。该
Printf("4. Print All Employees
");
本来应该的
printf("4. Print All Employees
");
以上是关于将struct数组传递给输入函数的主要内容,如果未能解决你的问题,请参考以下文章
将 STRUCT 的 ARRAY 传递给标准 BigQuery SQL 的用户定义函数
Swift - 将struct数组传递给另一个struct的init