为什么fgets()不在这里工作?

时间:2016-02-04 20:08:40

标签: pointers structure fgets

在下面的代码中,scanf()正在努力从用户那里获取名称但是fgets()不起作用请某人帮我理解为什么它不起作用

#include <stdio.h>
#include <stdlib.h>
typedef struct university{
    int roll_no;
    char name[16];
}uni;
int main()
{
    uni *ptr[5],soome;char i,j=0;
    for(i=0;i<5;i++)
    {
        ptr[i]=(uni*)calloc(1,20);
        if(ptr[i]==NULL)
        {
            printf("memory allocation failure");
        }
        printf("enter the roll no and name \n");
        printf("ur going to enter at the address%u \n",ptr[i]);
        scanf("%d",&ptr[i]->roll_no);
        //scanf("%s",&ptr[i]->name);
        fgets(&ptr[i]->name,16,stdin);
    }
    while(*(ptr+j))
    {
        printf("%d %s\n",ptr[j]->roll_no,ptr[j]->name);
        j++;
    }
    return 0;
}

1 个答案:

答案 0 :(得分:-1)

首先,fgets(char *s, int n, FILE *stream)有三个参数:一个指针 s 到字符数组的开头,一个计数 n 和一个输入流。
在原始应用程序中,您使用地址运算符&来获取指针而不是name[16]数组的第一个元素,而是指向其他内容(要使用地址运算符,您应该引用第一个char在数组中:name[0])。

您在应用程序中使用了大量的幻数(例如,20作为uni结构的大小)。在我的样本中,我尽可能使用sizeof 鉴于您使用calloc,我使用的事实是第一个参数是大小等于第二个参数的元素数,以便一次预分配所有五个uni结构。

最终结果是:

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

#define NUM_ITEMS (5)
#define NAME_LENGTH (16)

typedef struct university{
  int roll_no;
  char name[NAME_LENGTH];
} uni;

int main()
{
  uni *ptr;
  int i;

  ptr = (uni*)calloc(NUM_ITEMS, sizeof(uni));
  if(NULL == ptr) {
    printf("memory allocation failure");
    return -1;
  }

  for(i=0; i<NUM_ITEMS; i++) {
    printf("enter the roll no and name \n");
    printf("You're going to enter at the address: 0x%X \n",(unsigned int)&ptr[i]);
    scanf("%d",&ptr[i].roll_no);
    fgets(ptr[i].name, NAME_LENGTH, stdin);
  }
  for(i=0; i<NUM_ITEMS; i++) {
    printf("%d - %s",ptr[i].roll_no,ptr[i].name);
  }

  free(ptr);
  return 0;
}

注意:我已添加对free(ptr);的调用,以释放应用程序结束时由calloc分配的内存,如果不可能,则返回不同的返回代码分配内存。