在这种情况下,如何在C的主函数中使用带有结构变量的函数?

问题描述 投票:0回答:1

执行时,显示未定义'e'。我无法在其中运行功能“ search1”。请在回答时,还请说明如何使用户添加元素的功能。(周期表)。感谢您的帮助。

#include<stdio.h>  
#include<stdlib.h> 

struct element 
{
    int atno; 
    char *name; 
    char *symbol; 
    char *mn; 
    float bp; 
    char *state; 
}; 
int i=0,n=118; 
void search1(); 

int main() 
{
    struct element e[n]; 
    e[1].atno=1;
    e[1].name="Hydrogen";
    e[1].symbol="H";
    e[1].mn="Metal";
    e[1].bp=-252.879;
    e[1].state="Gas";

    e[2].atno=2;
    e[2].name="Helium";
    e[2].symbol="He";
    e[2].mn="Non-Metal";
    e[2].bp=-268.28;
    e[2].state="Gas";

    search1();
}

void search1()
{
    int a;
    printf("Enter the atomic number: ");
    scanf("%d",&a);

    if(a<1 && a>n)
    {
        printf("The element dosen't exist");
    }
    else
    {
        for(i=0;i<n;i++)
        {
            if (e[i].atno == a)
            {
                printf("Atomic Number = %d \nName = %c \nSymbol = %c \nMetal/Non-Metal = %c \nBoiling Point(deg C) = %f \nState at room temperature = %c\n",e[i].atno,e[i].name,e[i].symbol,e[i].mn,e[i].bp,e[i].state);
            }
        }
    }
}
c data-structures
1个回答
1
投票

当您在一个函数中定义变量时,它将是该函数的局部变量,位于该函数堆栈内且不在该范围内,因此将不再定义它,因此如果要让函数查看局部变量,则应将此变量传递给其他函数,但还要注意,如果按值调用它们,则如果对这些功能进行任何更改,它们都不会在该功能之外更改。

您也可以定义全局变量,如果您不想传递它们,但是不建议这样做,因为如果您不够谨慎的话,这样每个函数都可以访问它们,这可能会带来很大的风险。

除了还有其他几个错误:

首先,我们从array而不是0初始化1。>>

将一个string复制到另一个中的秒,您不能使用=,而应该使用strcpy

然后您还没有定义字符串,则定义了char *,这是不同的。为了使用它,您应该首先为其分配内存,如果不是您想要的,则定义字符数组。

我们不使用%c打印字符串,而使用%s打印字符串

而且您也没有定义int n(在主目录中)和int i(在search1中),因此不能使用未定义和未初始化的变量,因此在定义int n之后,应该对其进行初始化。

外观

struct element
{
    int atno;
    char name[20];
    char symbol[20];
    char mn[20];
    float bp;
    char state[20];
};
void search1(struct element e[],int n)
{
    int a;
    printf("Enter the atomic number: ");
    scanf("%d", &a);

    if (a<1 && a>n)
    {
        printf("The element dosen't exist");
    }
    else
    {
        for (int i = 0; i < n; i++)
        {
            if (e[i].atno == a)
            {
                printf("Atomic Number = %d \nName = %s \nSymbol = %s \nMetal/Non-Metal = %s \nBoiling Point(deg C) = %f \nState at room temperature = %s\n", e[i].atno, e[i].name, e[i].symbol, e[i].mn, e[i].bp, e[i].state);
            }
        }
    }
}
int main()
{
     int n=2;
    struct element e[n];
    e[0].atno = 1;// you could also use malloc to allocate memory for char* type
    strcpy(e[0].name , "Hydrogen");
    strcpy(e[0].symbol , "H");
    strcpy(e[0].mn , "Metal");
    e[0].bp = -252.879;
    strcpy(e[0].state ,"Gas");

    e[1].atno = 2;
    strcpy(e[1].name, "Helium");
    strcpy(e[1].symbol, "He");
    strcpy(e[1].mn, "Non-Metal");
    e[1].bp = -268.28;
    strcpy(e[1].state, "Gas");

    search1(e,n);
}
© www.soinside.com 2019 - 2024. All rights reserved.