你有三个问题:
首先你要访问:
job[i].name.e_lastname
不是
job[i].emp.e_lastname
第二你应该有:
scanf("%s",&job[i].name.e_lastname);
代替
scanf("%s",job[i].name.e_lastname);
您没有通过&
,因为它是您传递给 scanf 函数的数组。
第三个问题你应该为你的char *e_lastname
和char *e_name
阵营分配内存struct emp_name
。
注意:
扫描
int scanf ( const char * 格式, ... );
从标准输入读取数据并根据参数格式将它们存储到附加参数指向的位置。
附加参数应指向已分配的对象,
其类型由格式字符串中的相应格式说明符指定。(来源)
所以你想要这个:
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 做的一些解决方法(在此处检查它们)
您可以使用fgets而不是 scanf 。fgets 允许您限制将放置在缓冲区中的数据。