在for循环中使用struct的问题

时间:2011-08-31 19:40:31

标签: c pointers for-loop struct

这是一个家庭作业问题。我的编译器是CodeBlocks。

这是我的代码:

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

struct Address{
    char number[5];
    char street[30];
    char city[30];
};

struct Employee{
    char ID[7];
    char name[31];
    struct Address *addr;
};

int main(){
    int n,i;
    char temp[7];
    printf("Enter number of Employee : ");
    scanf("%d",&n);
    struct Employee **p=(struct Employee **)malloc(n*sizeof(struct Employee *));

    for (i=0; i<n; i++)
    {
        p[i]=(struct Employee *)malloc(sizeof(struct Employee));
        p[i]->addr=(struct Address *)malloc(sizeof(struct Address));
    }

    for(i=0; i<n; i++)
    {
        printf("Employee #%d\n",i+1);
        printf("Enter ID : ");
        gets(p[i]->ID);
        printf("Enter Name : ");
        gets(p[i]->name);
        printf("Enter Home number : ");
        gets(p[i]->addr->number);
        printf("Enter Street : ");
        gets(p[i]->addr->street);
        printf("Enter City : ");
        gets(p[i]->addr->city);
    }
}

我的问题是,当我运行此代码时,我无法输入#1员工的ID;但是,我可以输入员工#2和#3的ID。

我的问题在哪里?

3 个答案:

答案 0 :(得分:1)

在循环第一次传递之前,gets()从控制台读取内容似乎存在一些问题。

在循环之前添加gets(temp);似乎可以修复它。更好的解决方案是使用除gets()之外的其他东西。

答案 1 :(得分:0)

初始scanf("%d", &n);不会使用尾随换行符,因此它可用于gets()调用。

顺便说一下,从不使用gets()。它不能安全使用。例如,如果您正在读取一个6字节的数组,并且用户输入10个字符,则会出现缓冲区溢出。请考虑使用fgets()代替(但请注意,与gets()不同,它会将'\n'字符留在缓冲区中。

答案 2 :(得分:0)

在任何用户输入之后,您应该明确清除输入缓冲区。您应该使用尺寸限制器使您的输入安全。你应该使用scanf的返回值。

scanf("%d",&n);while(getchar()!='\n');
...
scanf("%6[^\n]",p[i]->ID);while(getchar()!='\n');
...
scanf("%30[^\n]",p[i]->name);while(getchar()!='\n');
...
scanf("%4[^\n]",p[i]->addr->number);while(getchar()!='\n');
...
scanf("%29[^\n]",p[i]->addr->street);while(getchar()!='\n');
...
scanf("%29[^\n]",p[i]->addr->city);while(getchar()!='\n');