2013-11-22 105 views
1

我有一個用於學校作業的兩個函數的代碼。我們剛剛瞭解了結構。兩個函數都必須將指針指向結構作爲參數。一個函數應該考慮用戶輸入來改變結構中的值,另一個函數應該打印出結構的內容。在我的第一個函數中,scanf或gets()不適用於我。我已經閱讀了書中的這一章,並且沒有運氣的課堂筆記。這裏是我的代碼:爲什麼scanf不會爲用戶輸入結構?

#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

開啓編譯器警告。 –

+0

試想一下你創建的變量是什麼。它是一個指向結構的指針,但它指向哪裏?你有沒有創建任何結構變量?也許你試圖通過引用傳遞一些東西;這是做到這一點的正確方法嗎? –

回答

1

首先,你將需要一個主返回值 - int main()。 如果您在將結構傳遞給函數之前將其初始化爲NULL,將會有所幫助。 在gets()中,您需要將地址(&)賦予您的結構變量。

希望有幫助!我發現代碼中的一些其他問題,但我認爲這是更好地爲您給他們找出自己:)

+0

您需要爲目標分配內存。 – Abhineet

+0

我總是看到人們用main的返回值做這件事,但我們的教授從來沒有告訴過我們這樣做。 – user3020768

+0

那麼,你用'return 0'結束你的main,肯定是一個'int'。即使你的教授不使用它,你也應該。需要告訴每個功能要返回的內容。 – VeganCreamPie

0

你有一些問題與printf S型試着進行打印,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); 
} 
+0

該代碼凍結了編譯器......? – user3020768

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. 變化打印標籤功能

    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);會把NULL 10位

//Change the following 
memset(str->Destination, 0, 10); //not memset(str->Destination, 10, 0); 
+0

當它到達PrintTicket時仍然凍結。另外,我們還沒有知道memset()是什麼。 – user3020768

相關問題