如何在 C 中调用带有结构指针作为参数的 void 函数?
How to call a void function with a struct pointer as parameter in C?
我真正需要的只是关于如何 return 这些类型的函数给它的调用者的例子。除了函数和参数的类型之外,甚至不必与我的代码相关。
我在下面写了这个函数,它应该读取三个用户定义的人的姓名和年龄。
void readData(Person *p)
{
char name1[20], name2[20], name3[20];
int age1, age2, age3;
printf("Enter person 1: \n");
scanf("%s %d", &name1, &age1);
printf("Enter person 2: \n");
scanf("%s %d", &name2, &age2);
printf("Enter person 3: \n");
scanf("%s %d", &name3, &age3);
struct person1 {char name1[20]; int age1};
struct person2 {char name2[20]; int age2};
struct person3 {char name3[20]; int age3};
struct Person {struct person1; struct person2; struct person3};
struct Person man[3] = {{name1, age1}, {name2, age2}, {name3, age3}};
p = &man;
}
我想重新使用上面函数的变量,以便我可以在下面的函数中使用它。我应该怎么做,因为我不能 're-declare' 变量,因为它们是用户定义的?我是通过参考还是价值来调用,如果是,我该怎么做?我需要 return
什么吗?我找不到此类功能的示例,非常感谢任何帮助。
Person findMiddleAge(Person *p)
{
int middle;
if ((age1 < age2 && age2 < age3) || (age3 < age2 && age2 < age1)) {
middle = age2;
struct Person man[1] = {name2, age2};
}
else if ((age2 < age1 && age1 < age3) || (age3 < age1 && age1 < age2)) {
middle = age1;
struct Person man[1] = {name1, age1};
}
else if ((age1 < age3 && age3 < age2) || (age2 < age3 && age3 < age1)) {
middle = age3;
struct Person man[1] = {name3, age3};
}
printf("%d \n", middle);
}
下面的代码块显示了我的整个代码,以防万一。 除了 readData(Person *p)
和 Person findMiddleAge(Person *p)
函数中的代码行外,无法修改任何内容。
typedef struct {
char name[20];
int age;
} Person;
void readData(Person *p);
Person findMiddleAge(Person *p);
int main()
{
Person man[3], middle;
readData(man);
middle = findMiddleAge(man);
printf("findMiddleAge(): %s %d\n", middle.name, middle.age);
return 0;
}
void readData(Person *p)
{
char name1[20], name2[20], name3[20];
int age1, age2, age3;
printf("Enter person 1: \n");
scanf("%s %d", &name1, &age1);
printf("Enter person 2: \n");
scanf("%s %d", &name2, &age2);
printf("Enter person 3: \n");
scanf("%s %d", &name3, &age3);
struct person1 {char name1[20]; int age1};
struct person2 {char name2[20]; int age2};
struct person3 {char name3[20]; int age3};
struct Person {struct person1; struct person2; struct person3};
struct Person man[3] = {{name1, age1}, {name2, age2}, {name3, age3}};
p = &man;
}
Person findMiddleAge(Person *p)
{
int middle;
if ((age1 < age2 && age2 < age3) || (age3 < age2 && age2 < age1)) {
middle = age2;
struct Person man[1] = {name2, age2};
}
else if ((age2 < age1 && age1 < age3) || (age3 < age1 && age1 < age2)) {
middle = age1;
struct Person man[1] = {name1, age1};
}
else if ((age1 < age3 && age3 < age2) || (age2 < age3 && age3 < age1)) {
middle = age3;
struct Person man[1] = {name3, age3};
}
printf("%d \n", middle);
}
是的,这是作业,但我真的尽力了(我试了 6 个多小时才得到想要的结果,但我还是做不到,C 对我来说真的很难理解)。我应该找到年龄在三个人中间的那个人,并且 return 这个人的名字和年龄给来电者。我做错了一切吗?我其实只是想知道如何将 return 这种功能传递给调用者。我需要添加任何 return
语句吗?我找不到关于它的例子(如果有人有任何例子,我想我可以用这些例子自己弄清楚代码)?
提前感谢您的帮助,非常感谢。
在readData
和findMiddleAge
中p
指向main
中的man[3]
。
在 readData
中可以直接填充数组。检查scanf
的return是个好习惯。如果扫描姓名和年龄,它将 return 2. return 为 1、0 或 EOF 表示有问题。
在 findMiddleAge
中确定 p[0].age
、p[1].age
或 p[2].age
的中间值和 return 中哪个是正确的。
#include <stdio.h>
typedef struct {
char name[20];
int age;
} Person;
void readData(Person *p);
Person findMiddleAge(Person *p);
int main()
{
Person man[3] = { { "", 0}}, middle = { "", 0};
readData(man);
middle = findMiddleAge(man);
printf("findMiddleAge(): %s %d\n", middle.name, middle.age);
return 0;
}
void readData(Person *p)
{
printf("Enter person 1: \n");
scanf("%19s %d", p[0].name, &p[0].age);
printf("Enter person 2: \n");
scanf("%19s %d", p[1].name, &p[1].age);
printf("Enter person 3: \n");
scanf("%19s %d", p[2].name, &p[2].age);
}
Person findMiddleAge(Person *p)
{
//figure out which is the middle value of
//p[0].age
//p[1].age
//p[2].age
return p[1];//or p[0] or p[2]
}
在一行中你有两个问题:
p = &man
- 您将指针分配给作为 UB 的局部变量(并在函数 return 之后取消引用它)。
- 您分配了局部指针
p
并且此分配没有任何效果(因为 p
在函数 returns 时停止存在)。要修改指针本身,您需要将指针传递给指针。
void readData(Person **p)
{
/* ... */
*p = newpvalue;
}
我相信你的代码中还有更多类似的问题。我建议专注于 C 基础知识(作用域、变量、指针等)
我真正需要的只是关于如何 return 这些类型的函数给它的调用者的例子。除了函数和参数的类型之外,甚至不必与我的代码相关。
我在下面写了这个函数,它应该读取三个用户定义的人的姓名和年龄。
void readData(Person *p)
{
char name1[20], name2[20], name3[20];
int age1, age2, age3;
printf("Enter person 1: \n");
scanf("%s %d", &name1, &age1);
printf("Enter person 2: \n");
scanf("%s %d", &name2, &age2);
printf("Enter person 3: \n");
scanf("%s %d", &name3, &age3);
struct person1 {char name1[20]; int age1};
struct person2 {char name2[20]; int age2};
struct person3 {char name3[20]; int age3};
struct Person {struct person1; struct person2; struct person3};
struct Person man[3] = {{name1, age1}, {name2, age2}, {name3, age3}};
p = &man;
}
我想重新使用上面函数的变量,以便我可以在下面的函数中使用它。我应该怎么做,因为我不能 're-declare' 变量,因为它们是用户定义的?我是通过参考还是价值来调用,如果是,我该怎么做?我需要 return
什么吗?我找不到此类功能的示例,非常感谢任何帮助。
Person findMiddleAge(Person *p)
{
int middle;
if ((age1 < age2 && age2 < age3) || (age3 < age2 && age2 < age1)) {
middle = age2;
struct Person man[1] = {name2, age2};
}
else if ((age2 < age1 && age1 < age3) || (age3 < age1 && age1 < age2)) {
middle = age1;
struct Person man[1] = {name1, age1};
}
else if ((age1 < age3 && age3 < age2) || (age2 < age3 && age3 < age1)) {
middle = age3;
struct Person man[1] = {name3, age3};
}
printf("%d \n", middle);
}
下面的代码块显示了我的整个代码,以防万一。 除了 readData(Person *p)
和 Person findMiddleAge(Person *p)
函数中的代码行外,无法修改任何内容。
typedef struct {
char name[20];
int age;
} Person;
void readData(Person *p);
Person findMiddleAge(Person *p);
int main()
{
Person man[3], middle;
readData(man);
middle = findMiddleAge(man);
printf("findMiddleAge(): %s %d\n", middle.name, middle.age);
return 0;
}
void readData(Person *p)
{
char name1[20], name2[20], name3[20];
int age1, age2, age3;
printf("Enter person 1: \n");
scanf("%s %d", &name1, &age1);
printf("Enter person 2: \n");
scanf("%s %d", &name2, &age2);
printf("Enter person 3: \n");
scanf("%s %d", &name3, &age3);
struct person1 {char name1[20]; int age1};
struct person2 {char name2[20]; int age2};
struct person3 {char name3[20]; int age3};
struct Person {struct person1; struct person2; struct person3};
struct Person man[3] = {{name1, age1}, {name2, age2}, {name3, age3}};
p = &man;
}
Person findMiddleAge(Person *p)
{
int middle;
if ((age1 < age2 && age2 < age3) || (age3 < age2 && age2 < age1)) {
middle = age2;
struct Person man[1] = {name2, age2};
}
else if ((age2 < age1 && age1 < age3) || (age3 < age1 && age1 < age2)) {
middle = age1;
struct Person man[1] = {name1, age1};
}
else if ((age1 < age3 && age3 < age2) || (age2 < age3 && age3 < age1)) {
middle = age3;
struct Person man[1] = {name3, age3};
}
printf("%d \n", middle);
}
是的,这是作业,但我真的尽力了(我试了 6 个多小时才得到想要的结果,但我还是做不到,C 对我来说真的很难理解)。我应该找到年龄在三个人中间的那个人,并且 return 这个人的名字和年龄给来电者。我做错了一切吗?我其实只是想知道如何将 return 这种功能传递给调用者。我需要添加任何 return
语句吗?我找不到关于它的例子(如果有人有任何例子,我想我可以用这些例子自己弄清楚代码)?
提前感谢您的帮助,非常感谢。
在readData
和findMiddleAge
中p
指向main
中的man[3]
。
在 readData
中可以直接填充数组。检查scanf
的return是个好习惯。如果扫描姓名和年龄,它将 return 2. return 为 1、0 或 EOF 表示有问题。
在 findMiddleAge
中确定 p[0].age
、p[1].age
或 p[2].age
的中间值和 return 中哪个是正确的。
#include <stdio.h>
typedef struct {
char name[20];
int age;
} Person;
void readData(Person *p);
Person findMiddleAge(Person *p);
int main()
{
Person man[3] = { { "", 0}}, middle = { "", 0};
readData(man);
middle = findMiddleAge(man);
printf("findMiddleAge(): %s %d\n", middle.name, middle.age);
return 0;
}
void readData(Person *p)
{
printf("Enter person 1: \n");
scanf("%19s %d", p[0].name, &p[0].age);
printf("Enter person 2: \n");
scanf("%19s %d", p[1].name, &p[1].age);
printf("Enter person 3: \n");
scanf("%19s %d", p[2].name, &p[2].age);
}
Person findMiddleAge(Person *p)
{
//figure out which is the middle value of
//p[0].age
//p[1].age
//p[2].age
return p[1];//or p[0] or p[2]
}
在一行中你有两个问题:
p = &man
- 您将指针分配给作为 UB 的局部变量(并在函数 return 之后取消引用它)。
- 您分配了局部指针
p
并且此分配没有任何效果(因为p
在函数 returns 时停止存在)。要修改指针本身,您需要将指针传递给指针。
void readData(Person **p)
{
/* ... */
*p = newpvalue;
}
我相信你的代码中还有更多类似的问题。我建议专注于 C 基础知识(作用域、变量、指针等)