2016-02-04 5 views
0

В приведенном ниже коде зсапЕ() работает для получения имени от пользователя, но fgets() не работает пожалуйста кто-то поможет мне понять, почему это не работаетПочему 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

Какая ошибка вы получаете? – Shaan

ответ

-1

Прежде всего, fgets(char *s, int n, FILE *stream) принимает три аргумента : указатель s в начало массива символов, счет n и поток ввода.
В исходном приложении вы использовали оператор адреса &, чтобы получить указатель не на первый элемент массива name[16], а на что-то другое (для использования оператора адреса вы должны были указать первый символ в массиве: 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 в конце приложения и другой код возврата, если это не представляется возможным выделите память.

Смежные вопросы