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

您确实需要小心指针以及分配或不分配的内容。我已经重写了您的代码,但使用了错误的解决方案。检查评论。

#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;
}    

链接1 :openbsd风格(9)

链接2:scanf的缺点

于 2012-12-05T02:30:29.580 回答
1

你有三个问题:

首先你要访问:

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_lastnamechar *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 允许您限制将放置在缓冲区中的数据。

于 2012-12-05T01:54:44.773 回答
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 回答