2016-11-03 139 views
2

我想编写一个简单的c代码来创建花园结构,输入详细信息如num_animals,花园类型和花园大小。 但是,我的代码给了我一些垃圾输出。将结构传递给函数c

#include <stdio.h> 
#include <string.h> 

struct Garden 
{ 
    int num_animals; 
    int size; 
    char type[10]; 
}; 

void Input(struct Garden gardname) 
{ 
    printf("\nEnter number of animals\n"); 
    scanf("%d",&gardname.num_animals); 

    printf("\nEnter size\n"); 
    scanf("%d",&gardname.size); 

    printf("\nEnter type\n"); 
    scanf("%s",gardname.type); 
} 


void Output(struct Garden gardname) 
{ 
    printf("Num of animals:%d\n",gardname.num_animals); 
    printf("size:%d\n",gardname.size); 
    printf("type:%s\n",gardname.type); 
} 

int main() 
{ 
    struct Garden Lumbini; 
    Input(Lumbini); 
    Output(Lumbini); 

    return 0; 
} 

回答

2

您已经定义,默认情况下使用通话按值方法传递参数,这意味着虽然你有Lumbini结构,你打算读,写元素的功能,你的功能反而使Lumbini(在这种情况下为gardname)的副本,并写入或打印出副本而不是Lumbini。它可能会导致重复的值。我用编写了相同的程序(请注意指向结构的指针是函数中的预期参数,并且在调用时传递参考lumbini)。这确保没有重复,并且只有相关结构(在这种情况下,lumbini)被操纵。

#include <stdio.h> 
#include <string.h> 

struct Garden 
{ 
    int num_animals; 
    int size; 
    char an_type[10]; 
}; 

void Input(struct Garden *gardname) 
{ 
    printf("\nEnter number of animals\n"); 
    scanf("%d", &gardname->num_animals); 

    printf("\nEnter size\n"); 
    scanf("%d", &gardname->size); 

    printf("\nEnter type\n"); 
    scanf("%s", gardname->an_type); 
} 


void Output(struct Garden *gardname) 
{ 
    printf("Num of animals:%d\n",gardname->num_animals); 
    printf("size:%d\n",gardname->size); 
    printf("type:%s\n",gardname->an_type); 
} 

int main() 
{ 
    struct Garden Lumbini; 
    Input(&Lumbini); 
    Output(&Lumbini); 

    return 0; 
} 

你得到的垃圾值,因为在gardname功能Output是一个局部变量来lumbini结构的未初始化的副本。当您打印出gardname的值时,它们将是垃圾值,因为它们未被初始化。当函数结束执行时,gardname被销毁。

此外,而不是写

scanf("%d",&gardname.num_animals)

你必须写

scanf("%d", &gardname->num_animals)

这将读入指针gardname的地址加上偏移成员num_animals进入结构。

+0

您需要取消引用该结构的指针:“(* gardname).num_animals'或(更常用)'gardname-> num_animals'。 – pmg

+0

哦,是的,编辑我的答案包括。谢谢! – Fabulous

+0

“您不能将结构传递给函数。” - 这显然是错误的!虽然它可能不是OP想要的,但你可以将'struct'传递给函数或返回结果。而C总是**传递值。没有传递参考。指针是他们自己的权利类型。 – Olaf