在下面的代码中,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;
}
答案 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
分配的内存,如果不可能,则返回不同的返回代码分配内存。