2016-01-08 11 views
6

Jestem nowy w programowaniu, aw szczególności w przypadku C. Próbuję napisać program, który używa tablicy struktur, ale mam problemy, jeśli ta struktura zawiera ciągi. W jakiś sposób kompilator ulega awarii po podaniu przez użytkownika ostatniego sygnału wejściowego.tablica struktur na wejściu c-user

Poniższa struktura jest po prostu uproszczoną wersją zawierającą tylko jeden element, ponieważ problem wydaje się być odczytywaniem ciągów znaków w tablicy. Każda pomoc jest doceniana z dużym wyprzedzeniem.

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
typedef struct 
{ 
    char* name; 
}student; 

int main() 
{ 
    int size; 
    printf("enter number of entries\n"); 
    scanf("%d" , &size); 
    student* all=malloc(size*sizeof(student)); 

    int i; 
    for(i=0;i<size;i++) 
    { 
     printf("enter name\n"); 
     scanf("%s" , all[i].name); 
    } 

    return 0; 
} 
+2

Nie zapomnij 'free' tej pamięci – Michi

+0

i nie wytwarzają żadnych innych błędów podczas będziesz dodanie tego – 4pie0

+0

zmianę także' 'int size' na długi bez znaku int "lub" size_t'. – Michi

Odpowiedz

6

Przed podjęciem wejście scanf("%s" , all[i].name);, trzeba przydzielić pamięci do all[i].name.

przykład-

for(i=0;i<size;i++) 
{ 
    all[i].name=malloc(20*sizeof(*(all[i].name))); 
    if(all[i].name!=NULL){ 
     printf("enter name\n"); 
     scanf("%19s" , all[i].name); 
    } 
} 
//use these strings 
for(i=0;i<size;i++){ 
     free(all[i].name);     //free the allocated memory 
} 
free(all); 

Or w swojej strukturze zamiast char * oświadczyć name jako char array (jeśli nie chcesz korzystać z dynamicznego przydzielania) -

typedef struct{ 
    char name[20];      //give any desired size 
}student; 
/*   no need to free in this case */ 
+0

@iharob Wspomniał o tym – ameyCU

0

Brak pamięci dla nazwisk uczniów (char* name), więc próbując uzyskać scanf t o ten wskaźnik, dostęp do nieprawidłowej pamięci i program ulega awarii.

Najprostszym sposobem jest zadeklarować name jako tablica: char name[28];

Wartość zwracana malloc() należy sprawdzić też, w przypadku nie było problemu alokacji pamięci dla students, która zwróci NULL pointer. Na koniec przydzielona pamięć musi zostać zwolniona przy pomocy free().

Na przykład:

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

typedef struct { 
    char name[28]; 
    unsigned int age; 
} student; 

int main() 
{ 
    size_t size = 0; 
    printf("\nEnter number of entries: "); 
    scanf("%zu", &size); 
    // add some check for size 

    student* students = (student*)malloc(size * sizeof(student)); 

    if (students == NULL) { 
     printf("\nProblem with allocating memory:\n" 
       " - size: %zu\n" 
       " - total size needed: %zu\n", 
       size, size * sizeof(student)); 
     return 0; 
    } 

    for (size_t i = 0; i < size; ++i) { 
     printf("Enter name: "); 
     scanf("%27s", students[i].name); 
     printf(" Enter age: "); 
     scanf("%u", &students[i].age); 
    } 

    printf("\nList of students:\n"); 

    for (size_t i = 0; i < size; ++i) { 
     printf("%s (%u)\n", students[i].name, students[i].age); 
    } 

    free(students); // free the allocated memory 

    return 0; 
} 
+0

Nie zapomnij wyczyścić bufora wejściowego po użyciu 'scanf': 'while (getchar()! = '\ n');' – d3L

+0

Edytowałem twoją odpowiedź: specyfikatory formatu dla 'scanf' również były błędne – d3L

+0

@ d3l - Dzięki, zaktualizowałem specyfikatory formatu (chociaż' "% zu" 'może nie być obsługiwane we wszystkich (starszych) kompilatorach). Nie sądzę, że wyczyszczenie' \ n' jest potrzebne, ponieważ nie szukamy znaków. –

Powiązane problemy