在C语言中,定义一个结构类型元素来表示元素周期表中的一个元素

在C语言中,定义一个结构类型元素来表示元素周期表中的一个元素,c,C,我正在用C编写代码,它不会给我任何错误,但我没有得到想要的结果 定义结构类型元素以表示元素周期表中的一个元素。组件应包括原子序数(整数);名称、化学符号和类别(字符串);原子量的数字字段;以及一个七元素整数数组,表示每个壳层中的电子数。以下是钠元素结构的组成部分。11钠碱金属22.9898 2 8 1 0 0 0 0 0定义和测试I/O功能扫描元素和打印元素 一旦我编译并测试了代码,这就是我得到的输出 11ÿsodNa Na 22.989800 2810000% 如您所见,它没有给我元素名或元素

我正在用C编写代码,它不会给我任何错误,但我没有得到想要的结果

定义结构类型元素以表示元素周期表中的一个元素。组件应包括原子序数(整数);名称、化学符号和类别(字符串);原子量的数字字段;以及一个七元素整数数组,表示每个壳层中的电子数。以下是钠元素结构的组成部分。11钠碱金属22.9898 2 8 1 0 0 0 0 0定义和测试I/O功能扫描元素和打印元素

一旦我编译并测试了代码,这就是我得到的输出 11ÿsodNa Na 22.989800 2810000%

如您所见,它没有给我元素名或元素类

这是我的密码:

#include <stdio.h>
#include <string.h>
#define ELEM_NAME 15
#define ELEM_CLASS 20
#define ELECT 7

  typedef struct
  {
    int atom_num;
    char name[ELEM_NAME];
    char symbol[3];
    char class_of_metal [ELEM_CLASS];
    double atomic_weight;
   nt elec[ELECT];
  } element_t;

element_t scan_element();

void print_element(element_t my_element);

element_t

scan_element(); 

int main(void)
{

  int i = 0;
  element_t my_element;

  printf("enter the atomic number:\n");
  scanf("%d", &my_element.atom_num);

  printf("enter element name:\n");
  scanf("%s", &my_element.name[ELEM_NAME]);

  printf("enter symbol:\n");
  scanf("%s", &my_element.symbol[3]);

  printf("enter type of metal:");
  scanf("%s", &my_element.class_of_metal[ELEM_CLASS]);

  printf("enter atomic weight:");
  scanf("%lf", &my_element.atomic_weight);

  printf("enter number of electrons in each shell:");
  scanf("%d", &my_element.elec[ELECT]);

 /* output */
    printf("%d   %s   %s   %s   %lf   %d", my_element.atom_num,
                                           my_element.name,
                                           my_element.symbol,
                                           my_element.class_of_metal,
                                           my_element.atomic_weight,
                                           my_element.elec[ELECT]);

 return (0);
 }
#包括
#包括
#定义元素名称15
#定义ELEM_类20
#定义选择7
类型定义结构
{
int-atom_-num;
字符名[元素名];
字符符号[3];
金属炭类[元素类];
双原子量;
新界电子[选举];
}元素t;
元素扫描元素();
无效打印元素(元素\u t我的元素);
元素
扫描元素();
内部主(空)
{
int i=0;
元素\u t我的元素;
printf(“输入原子序数:\n”);
scanf(“%d”&我的元素.atom\u num);
printf(“输入元素名称:\n”);
scanf(“%s”&我的元素名[ELEM_name]);
printf(“输入符号:\n”);
scanf(“%s”和my_元素符号[3]);
printf(“输入金属类型:”);
scanf(“%s”和my_element.class_of_metal[ELEM_class]);
printf(“输入原子量:”);
scanf(“%lf”&我的元素原子量);
printf(“输入每个壳层中的电子数:”);
scanf(“%d”和my_element.elec[ELECT]);
/*输出*/
printf(“%d%s%s%s%lf%d”),my\u element.atom\u num,
我的_element.name,
我的元素符号,
我的元素,金属等级,
我的元素,原子量,
my_element.elec[ELECT]);
返回(0);
}

您误解了如何
scanf()
将字符串放入数组。比如说,

&my_element.name[ELEM_NAME]
指向元素的末尾(在我看来,您认为
scanf()
需要此信息,但不需要),因此您在数组的边界之外写入

因此,您应该将所有这些错误的函数调用更改为

scanf("%s", my_element.name);
scanf("%s", my_element.symbol);
scanf("%s", my_element.class_of_metal);
scanf("%d", my_element.elec);
分别


(另外,请仔细阅读数组、指针和指针算法。这太基本了…

您误解了如何将字符串
scanf()
放入数组。比如说,

&my_element.name[ELEM_NAME]
指向元素的末尾(在我看来,您认为
scanf()
需要此信息,但不需要),因此您在数组的边界之外写入

因此,您应该将所有这些错误的函数调用更改为

scanf("%s", my_element.name);
scanf("%s", my_element.symbol);
scanf("%s", my_element.class_of_metal);
scanf("%d", my_element.elec);
分别


(另外,请仔细阅读数组、指针和指针算法。这太基本了…

输出“不需要”如何?输出“不需要”如何?我认为您需要在固定代码中省略字符串的&运算符。数组变量名已与第一个元素的地址相同,不带&@hyde是不必要的,该值与带或不带addressof运算符的值相同。我更喜欢保留它,因为如果结构成员的类型从数组类型更改为标量,这样做是安全的。(只是类型不同,但在这种情况下没关系)。谢谢你们两位的建议。H2CO3:我只写了大约两个月的c,在此之前,我完全没有编程经验。这是一门入门课程,而且我理解这些概念,这个类的节奏太快,以至于很难学习如何将其应用到代码中。警告:format–s–期望参数的类型为–char–但参数2的类型为–char()[15]-[-Wformat],我遵循了你们两位的建议。我之前已经按照您建议的H2CO3编译了我的程序,但是它为每个scanf行
scanf(“%s”、&my_element.name)提供了这个错误
调用未定义的行为,
&my_元素。name
字符(*)[15]
,但
%s
格式需要
字符*
。要找到一个类型不匹配确实有害的平台并不容易,但最好是类型正确且安全。我认为您需要在固定代码中省略字符串的&运算符。数组变量名已与第一个元素的地址相同,不带&@hyde是不必要的,该值与带或不带addressof运算符的值相同。我更喜欢保留它,因为如果结构成员的类型从数组类型更改为标量,这样做是安全的。(只是类型不同,但在这种情况下没关系)。谢谢你们两位的建议。H2CO3:我只写了大约两个月的c,在此之前,我完全没有编程经验。这是一门入门课程,而且我理解这些概念,这个类的节奏太快,以至于很难学习如何将其应用到代码中。警告:format–s–期望参数的类型为–char–但参数2的类型为–char()[15]-[-Wformat],我遵循了你们两位的建议。我之前已经按照您建议的H2CO3编译了我的程序,但是它为每个scanf行
scanf(“%s”、&my_element.name)提供了这个错误
调用未定义的行为,
&my_元素。name
字符(*)[15]
,但
%s
格式需要
字符*
。要找到一个类型不匹配确实有害的平台并不容易,但最好是类型正确且安全。