我有一个代码,包含两个学校作业的功能。我们刚刚了解了结构。两个函数都必须将指向结构的指针作为参数。一个函数应该接受用户输入来改变结构中的值,另一个函数应该打印出结构的内容。在我的第一个函数中,Scanf或gets()对我不起作用。我已经查阅了书中的章节和课堂笔记,没有运气。这是我的代码:
#include<stdio.h>
#include<stdlib.h>
struct Traveller {
int Ticket_ID;
char Destination;
float Price;
};
void CreateTicket(struct Traveller*);
void PrintTicket(struct Traveller*);
main() {
struct Traveller * str;
CreateTicket(str);
PrintTicket(str);
system("PAUSE");
return 0;
}
void CreateTicket(struct Traveller* ptr) {
printf("Please enter your ticket ID.\n");
scanf("%d", &ptr->Ticket_ID);
printf("\n\nPlease enter your destination.\n");
gets(ptr->Destination);
printf("\n\nPlease enter the price.\n");
scanf("%f", &ptr->Price);
}
void PrintTicket(struct Traveller* ptr) {
printf("\n\n%s\n", ptr->Ticket_ID);
printf("%s\n", ptr->Destination);
printf("%.2s\n", ptr->Price);
}
答案 0 :(得分:1)
首先,您需要main的返回值 - int main ()
。
如果在将结构传递给函数之前将其初始化为NULL
,将会有所帮助。
在gets()
中,您需要将地址(&
)提供给结构变量。
希望有所帮助!我在代码中发现了一些其他问题,但我认为你最好自己解决这个问题:)
答案 1 :(得分:0)
您尝试打印的printf
类型存在一些问题,main
未按规定声明,gets
。
这是正确的代码:
#include<stdio.h>
#include<stdlib.h>
struct Traveller {
int Ticket_ID;
char Destination;
float Price;
};
void CreateTicket(struct Traveller*);
void PrintTicket(struct Traveller*);
int main(void) {
struct Traveller * str;
CreateTicket(str);
PrintTicket(str);
return 0;
}
void CreateTicket(struct Traveller* ptr) {
printf("Please enter your ticket ID.\n");
scanf("%d", &ptr->Ticket_ID);
printf("\n\nPlease enter your destination.\n");
scanf("%s",&ptr->Destination);
printf("\n\nPlease enter the price.\n");
scanf("%f", &ptr->Price);
}
void PrintTicket(struct Traveller* ptr) {
printf("\n\n%d\n", ptr->Ticket_ID);
printf("%s\n", &ptr->Destination);
printf("%.2f\n", ptr->Price);
}
答案 2 :(得分:0)
您需要为结构指针 ptr 分配内存。并将目的地从char Destination
更改为char* Destination
进行以下更改:
旅行者结构中的更改
struct Traveller {
int Ticket_ID;
char* Destination; // change from char to char*
float Price;
};
主要功能的变化
int main(void) {
// Changes Here (allocate memory)
struct Traveller * str = (struct Traveller *)malloc(sizeof(struct Traveller));
str->Destination = (char *)malloc(sizeof(char) * 10); // for 9 char + null
memset(str->Destination, 0, 10);
// Changes Over
CreateTicket(str);
PrintTicket(str);
return 0;
}
CreateTicket 功能的变化
void CreateTicket(struct Traveller* ptr) {
//Rest of the code
scanf("%s",ptr->Destination); // don't use &ptr->Destination
}
PrintTicket 功能的更改
void PrintTicket(struct Traveller* ptr) {
printf("\n\n%d\n", ptr->Ticket_ID); // %s to %d
printf("%s\n", ptr->Destination);
printf("%.2f\n", ptr->Price); // %s to %f
}
==编辑(关于memset)==
void *memset(void *str, int c, size_t n)
将字符c(无符号字符)复制到参数str指向的字符串的前n个字符。
memset(str->Destination, 0, 10);
将为10个职位设置NULL
//Change the following
memset(str->Destination, 0, 10); //not memset(str->Destination, 10, 0);