あなたには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を使用すると、バッファに配置されるデータを制限できます。