下面是我从函数返回结构的代码。可能是一个非常基本的问题,但我不清楚为什么我在emp
这一行写struct emp putinfo (){
。我不清楚为什么我需要写结构名称?因为在函数内部我将结构定义为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;
}
答案 0 :(得分:1)
struct emp
实际上是用C语言表达结构的名称。你可以typedef
它,然后你只能写emp
。它之前的原因是{{1}因为这是函数返回的类型。putinfo
只是创建一个struct emp t
类型的新结构并将其分配给emp
。
答案 1 :(得分:1)
在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(){}
答案 2 :(得分:0)
定义你的结构并改为使用类型定义:
#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;
}
答案 3 :(得分: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
是无缓冲的,并且此输出无论如何都不应该转到stdout
。)。
通常,在您熟悉指针和数组,动态内存分配,错误处理和文件缓冲之前,我建议您不要编写交互式程序,而是通过命令行参数传递用户的信息。您目前对于正确编写交互式程序知之甚少。
HTH