为什么scanf不接受用户输入的结构?

时间:2013-11-22 07:58:31

标签: c pointers structure scanf

我有一个代码,包含两个学校作业的功能。我们刚刚了解了结构。两个函数都必须将指向结构的指针作为参数。一个函数应该接受用户输入来改变结构中的值,另一个函数应该打印出结构的内容。在我的第一个函数中,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);
 }

3 个答案:

答案 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

进行以下更改:

  1. 旅行者结构中的更改

    struct Traveller {
        int Ticket_ID;
        char* Destination;  // change from char to char*
        float Price;
    };
    
  2. 主要功能的变化

    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;
    
    }
    
  3. CreateTicket 功能的变化

    void CreateTicket(struct Traveller* ptr) {
        //Rest of the code
        scanf("%s",ptr->Destination);  // don't use &ptr->Destination
    }
    
  4. 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
    }
    
  5. ==编辑(关于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);