我在使用函数内部的结构时遇到了一些麻烦。
该计划旨在:
虽然第1点和第3点工作正常,但我遇到了问题。该名称将输入并打印得很好,但无论我输入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++;
}
答案 0 :(得分:1)
足够简单:您没有更新information
年,但是您将其作为复制的参数传递(您在Person
中复制int
以及指向personBirthyear
中char
的指针。
因此:
personName
您需要传递年份的地址,并在此处使用指针:
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;
}
在任何情况下,您都不检查scanf的结果;因此你不知道你是否真的读过一个数字。你应该检查一下:
psn[i].bYr = personBirthyear();
int n = scanf("%d", &birthyear);
getchar();
if (n != 1) return -1;
return birthyear;
仍然必须“清除”使getchar
失败的字符(否则,它会一次又一次地重读......)。
答案 1 :(得分:0)
您的代码中存在一些问题: