gpt4 book ai didi

c - 处理 C 中的结构函数 - 可以输入数组,但不能输入 int

转载 作者:行者123 更新时间:2023-11-30 20:21:50 27 4
gpt4 key购买 nike

我在函数内部使用结构时遇到了一些麻烦。

该计划的目的是:

  1. 创建一个包含五个 Person 类型结构的数组
  2. 允许用户通过使用函数输入数据类型。
  3. 一一打印输入的五个人。

虽然第 1 点和第 3 点工作正常,但我遇到了问题第 2 点。该名称将很好地输入并打印,但无论我在 scanf 中输入什么,它都会返回并打印“-858993460”。

int calls = 0;

typedef struct person {
char name[20];
int bYr;
}Person;

int main(int argc, char** argv) {
Person psn[5];

for (int i = 0; i < 5; i++) {
printf("Please enter the name and birthyear of person %d.", i+1);
personName(psn[i].name);
personBirthyear(psn[i].bYr);
}

for (int i = 0; i < 5; i++) {
printPerson(psn[i]);
}

getchar();

return 0;
}

int personBirthyear(int birthyear) {
printf("\nBirthyear: ");
scanf("%d", &birthyear);
getchar();
return birthyear;
}

char* personName(char* pername) {
printf("\nName: ");
fgets(pername, 20, stdin);
return pername;
}

void printPerson(Person prsn) {
printf("Person %d:\nBirthyear: %d\nName: %s\n", calls+1, prsn.bYr, prsn.name);
calls++;
}

最佳答案

很简单:您没有更新 Person 的年份,而是将其作为复制的参数传递(您复制了 int personBirthyear 中的指针和 personName 中指向 char 的指针)。

因此:

personName(psn[i].name); // works
personBirthyear(psn[i].bYr); // fails

您需要传递年份地址,并在此处使用指针:

int personBirthyear(int* birthyear) {
printf("\nBirthyear: ");
scanf("%d", birthyear);
getchar();
return *birthyear;
}

或者,您也可以删除出生年份:

int personBirthyear() {
int birthyear;
printf("\nBirthyear: ");
scanf("%d", &birthyear);
getchar();
return birthyear;
}

然后:psn[i].bYr = personBirthyear();

无论如何,你都不检查scanf的结果;因此你不知道你是否真的读到了一个数字。你应该检查一下:

int n = scanf("%d", &birthyear);
getchar();
if (n != 1) return -1;
return birthyear;

仍然强制使用getchar来“清除”导致scanf失败的字符(否则,它将被一次又一次地重新读取......)。

关于c - 处理 C 中的结构函数 - 可以输入数组,但不能输入 int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41312236/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com