0

C でコードを書いていますが、エラーは発生しませんが、目的の結果が得られません。

元素の周期表の 1 つの元素を表す構造型 element_t を定義します。コンポーネントには原子番号 (整数) を含める必要があります。名前、化学記号、およびクラス (文字列)。原子量の数値フィールド。各シェルの電子数の整数の 7 つの要素の配列。以下は、ナトリウムの element_t 構造体のコンポーネントです。11 ナトリウム Na アルカリ金属 22.9898 2 8 1 0 0 0 0 I/O 関数 scan_element および print_element を定義してテストします。

コードをコンパイルしてテストすると、次の出力が得られます 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);
 }
4

1 に答える 1

3

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);

それぞれ。

(また、配列、ポインター、およびポインター演算について読んでください。これはあまりにも基本的です...)

于 2012-12-03T22:36:33.653 に答える