[英]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.