1

次の形式の構造体のネストされた配列があります。

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

typedef struct
{
    char* e_name;
    char* e_lastname;
}emp_name;

typedef struct
{
   emp_name name;
   int id;
}emp;

int main(int argc, char *argv[])
{
  int i;
  int cod=100;
  emp job[3];
  for (i=0;i<3;i++)
  {

     scanf("%s",&job[i].emp.e_lastname);
     job[i].id=cod;
      cod++;
 }
     for (i=0;i<3;i++)
  {
       printf("%s",job[i].emp.e_lastname);
         printf("%d\n",job[i].id);
  }
 system("PAUSE");   
    return 0;
  }

しかし、プログラムが印刷部分でハングしているのはなぜですか?ありがとう

4

3 に答える 3

1

あなたには3つの問題があります:

最初にアクセスしたい:

job[i].name.e_lastname

いいえ

job[i].emp.e_lastname

2番目に必要なもの:

scanf("%s",&job[i].name.e_lastname); 

それ以外の

scanf("%s",job[i].name.e_lastname);

&scanf関数に渡す配列であるため、渡しません。

3番目char *e_lastnameの問題は、char *e_nameのキャンプにメモリを割り当てる必要がありますstruct emp_name

ご了承ください:

scanf

int scanf(const char * format、...);

stdinからデータを読み取り、パラメーター形式に従って、追加の引数が指す場所にデータを格納します。

追加の引数は 、フォーマット文字列内の対応するフォーマット指定子によって指定されたタイプのすでに割り当てられたオブジェクトを指している必要があります。ソース

だからあなたはこれが欲しい:

int main(int argc, char *argv[])
{
  int i;
  int string_size = 10;
  int cod=100;
  emp job[3];


  for (i=0;i<3;i++) // Allocate space for the string you will access.
  {
  job[i].name.e_name = malloc(sizeof(char)*string_size);
  job[i].name.e_lastname = malloc(sizeof(char)*string_size);
  }

  for (i=0;i<3;i++)
  {

     scanf("%s",job[i].name.e_lastname);
     job[i].id=cod;
     cod++;
 }
     for (i=0;i<3;i++)
  {
       printf("%s",job[i].name.e_lastname);
         printf("%d\n",job[i].id);
  }
 system("PAUSE");   
    return 0;
  }

scanfの使用は安全ではないという事実を考慮してください。理由は、次のとおりです。

%sおよび%[変換を不適切に使用すると、読み取られる文字数は、次の空白文字が表示される場所によってのみ制限されます。これは、入力が長すぎると、提供したバッファがオーバーフローするため、無効な入力によってプログラムがクラッシュする可能性があることをほぼ確実に意味します。バッファの長さに関係なく、ユーザーは常により長い入力を提供できます。適切に作成されたプログラムは、クラッシュではなく、わかりやすいエラーメッセージで無効な入力を報告します。(ソース

それでも、scanfを使用するために実行できるいくつかの回避策があります(ここで確認してください

scanfの代わりにfgetsを使用できます。fgetsを使用すると、バッファに配置されるデータを制限できます。

于 2012-12-05T01:54:44.773 に答える
1

あなたは本当にポインタと何が割り当てられるかどうかに注意する必要があります。私はあなたのコードを書き直しましたが、間違った解決策でした。コメントを確認してください。

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

typedef struct emp_name {
    /* 
     * now there you had just char*. this decares
     * a pointer to some memory but no memory is allocated.
     * if you were going with that approach you should initialize
     * the struct and assign those values to something you malloc'ed().
     * This version suffers from fixed size and a possible buffer overflow if
     * you chose scanf to write the data in the buffer.
     */
    char e_name[512];
    char e_lastname[512];
    /*
     * try to follow conventions. your previous struct declarations
     * were anonymous. if it caught an error you wouldn't know in which
     * struct it would be.  good practices here: link1 (bottom) 
     */
} emp_name_t;

typedef struct emp {
    emp_name_t emp;
    int id;
} emp_t;

int main(int argc, char *argv[]) {
    int i;
    int cod=100;
    emp job[3];
    for (i=0;i<3;i++) {
        /*
         * check out this excelent post for a secure alternative:
         * link2 (bottom)
         */
        scanf("%s",&job[i].emp.e_lastname);
        job[i].id=cod;
        cod++;
     }
     for (i=0;i<3;i++) {
         printf("%s",job[i].emp.e_lastname);
         printf("%d\n",job[i].id);
     }
     return 0;
}    

link1 :openbsd style(9)

link2:scanfの欠点

于 2012-12-05T02:30:29.580 に答える
0

私はあなたが持っているのを見ます:

typedef struct
{
    char* e_name;
    char* e_lastname;
}emp_name;

typedef struct
{
   emp_name name;
   int id;
}emp;

emp job[3];

では、次の行で.empは何をしているのでしょうか。それはどの構造のメンバーでもありません

job[i].emp.e_lastname 
于 2012-12-05T01:49:28.063 に答える