从功能返回结构

时间:2014-07-17 11:14:35

标签: c function structure

下面是我从函数返回结构的代码。可能是一个非常基本的问题,但我不清楚为什么我在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;

}

4 个答案:

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