簡體   English   中英

從函數返回結構

[英]Returning structure from function

下面是我從函數返回結構的代碼。 可能是一個非常基本的問題,但我不清楚為什么我要在struct emp putinfo (){這行中寫emp 我不清楚為什么我需要寫結構名稱? 因為我在函數內部將結構定義為struct emp t; 具體原因是什么?

#include <stdio.h>


struct emp {

    int number;
    char name [200];

};


void print (struct emp team){

    printf ("Details of employee %d %s", team.number, team.name );

}

struct emp putinfo (){

    struct emp t;
    printf ("Enter number"); scanf ("%d", &t.number);
    printf ("Enter name"); scanf ("%s", &t.name);
    return t;
}


int main (){

    struct emp test;
    test = putinfo ();
    print (test);
    return 0;

}

struct emp實際上是與你解決C.您可以將結構名稱typedef ,然后你可以只寫emp 。原因為什么它的立場之前putinfo是因為這是返回類型的函數。 struct emp t只是創建了emp類型的新結構並將其分配給t

C ,定義結構時創建的類型名稱為struct structure_name C++允許使用此格式,也可以僅使用structure_name

例:

struct some_struct{};
struct some_struct x;   // Variable declaration C, C++ syntax.
some_struct y;          // Only C++ syntax.

如果使用C ,則必須使用C語法指定函數的返回值:

struct some_struct my_function(){}

另一方面,在C++您可以

struct some_struct my_function(){}

要么

some_struct my_function(){}

定義您的結構並改用類型定義:

#include <stdio.h>


typedef struct {

    int number;
    char name [200];

}emp;


void print (emp team){

    printf ("Details of employee %d %s", team.number, team.name );

}

 emp putinfo (){

    emp t;
    printf ("Enter number"); scanf ("%d", &t.number);
    printf ("Enter name"); scanf ("%d", &t.name);
    return t;
}


int main (){

    printf("hello\n");
    emp test;
    test = putinfo ();
    print (test);
    return 0;

}

您是對的,因為這是多余的(乍一看,但請參閱下文),但這就是C的工作方式,沒有類型推斷。 這對於每種類型都是相同的(並且與結構無關):

succ.c

unsigned succ(unsigned n) {
    unsigned succ = n + 1;
    return succ;
}

在這里,您也可以說,沒有真正的理由必須指定返回類型。

因此,現在是為什么需要這樣做的部分:

1)至少在原型中需要它,因為編譯器可能看不到定義,請考慮

main.c中

#include <stdio.h>

unsigned succ(unsigned);

int main(void) {
    printf("%u\n", succ(1));
}

包含succ的實現的目標文件可能已經被編譯(您可以通過gcc main.c succ.o等進行編譯)。

2)考慮

long int_to_long(int n) { return n; }

int轉換為long (如果沒有返回類型,編譯器將無法知道)。 好的,這並不適用於結構(它們從不隱式轉換),但是是一致的。

通常,您根本不按值傳遞結構,而是傳遞指向它的指針,尤其是當它們很大時。

最后,關於代碼的一些注意事項:

永遠不要將沒有長度的%s用於scanf 總是錯的( scanf應該如何知道您提供的數組有多大?),例如

printf ("Enter name\n"); scanf ("%199s", t.name);

或者使用fgets代替; 在生產代碼中,您幾乎永遠都不想使用scanf ,因為錯誤處理很復雜。 還要注意我添加的換行符,直到您向stdout寫了換行符之后,要求輸入的消息才會出現( stdout通常是行緩沖的,因此通常是終端,(更好的)替代方法是fprintf(stderr, "Enter name: "); stderr因為stderr是沒有緩沖的,並且此輸出無論如何都不應該真正進入stdout 。)。

通常,我建議您在熟悉指針和數組,動態內存分配,錯誤處理和文件緩沖之前,不要編寫交互式程序,而是通過命令行參數從用戶那里傳遞信息。 您目前對正確編寫交互式程序知之甚少。

HTH

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM