2016-10-09 1 views
1

verschiebe Ich versuche, Name und Alter in einem dynamischen Array zu speichern, wenn wir eine andere Art von Daten haben, Int und Char, dass wir nicht wissen, die Größe in der beginnen Sie, wie man ein dynamisches Array verwendet, um die 2 Typen zu speichern Wie man verschiedene Arten von Datentypen in einem Array dynamisch in C

typedef struct personne{ 
char nom ; 
int age ; 

}personne; 

struct personne saisie_personne_suivante(struct personne* x){ 


scanf("%s",&x->nom); 


scanf("%d",&x->age); 


return *x; 
} 

int main(void){ 


personne *ali; 
ali = malloc(sizeof(char*)); 
saisie_personne_suivante(ali); 

printf("\n %d ",ali->age); 


printf("\n %s",&ali->nom); 
return 0; 
} 

Warum ich nicht Erfolg habe?

+2

Ich rate Ihnen dringend, ein Buch auf C oder ein anständiges Tutorial zu bekommen. – mewa

+1

Was Sie tun, ist die Zuweisung von Speicherplatz gleich der Größe eines Zeigers auf char, (die entweder 32 oder 64 Bit breit ist, abhängig von Ihrem Betriebssystem). Was Sie wahrscheinlich tun möchten, ist die Zuweisung von Speicherplatz gleich der Größe Ihrer Struktur (5 Bytes am wahrscheinlichsten), das ist "sizeof (struct personne)" – mewa

Antwort

0

Ich denke, wir können nicht zwei Arten von Daten gleichzeitig in array.Wenn wir dies tun, müssen wir die Hälfte des Speichers char und die Hälfte der ganzen Zahlen zuweisen, vorausgesetzt, Sie sollten einige Größe des Arrays geben. => in Ihrem Programm in dieser Zeile [ali = malloc (sizeof (char *))] übergeben Sie die Adresse nur char nicht der Variable.Wenn Sie beide Werte speichern möchten übergeben Sie einfach die Adresse von beiden int und char.

+0

ist es eine Antwort? – manetsus

0

ali ist ein Zeiger auf eine Struktur mit einer Größe, die zwischen sizeof(char) + sizeof(int) Architekturen variieren.

einstweilen, nehmen wir an, es 5 Byte ist (die es wahrscheinlich auf Ihrem PC).

Was Sie tun, ist die Zuweisung von Speicherplatz gleich der Größe einer pointer to char, (die entweder 32 oder 64 Bit breit ist, abhängig von Ihrem Betriebssystem).

Was Sie wahrscheinlich Raum gleich Größe Ihrer Struktur tun wollen zuweisen (5 Bytes), das heißt:

ali = malloc(sizeof(personne)); 

Hinweis der Mangel an *, da sie eine Struktur tatsächliche Speicher wollen und nicht ein Zeiger, der auf einen solchen Ort zeigt.

By the way, würden Sie nicht schreiben wollen: malloc(sizeof(char)) entweder, denn das ist nur ein Byte für Ihre Struktur erforderlich wäre.

I stark beraten Sie Ihre Hände auf ein Buch über C oder ein anständiges Tutorial zumindest zu erhalten.

0
int main() { 

personne *ali; 
ali = (struct personne *)malloc(sizeof(personne)); 

saisie_personne_suivante(ali); 

printf("\n %d ", ali->age); 

printf("\n %c", ali->nom); 
return 0; 

}

Es ist nicht genügend Speicher für struct personne, so müssen Sie sizeof (personne) Speicher malloc. nom ist kein Zeiger, es ist eine char-Variable. Wenn Sie es drucken, verwenden Sie printf ("% c", ali-> nom);

0

Ich kann den Kommentatoren zustimmen, die ein gutes Buch/Tutorial empfohlen haben, aber trotzdem: hier ist Ihr reparierter Code, mit ein wenig Kommentar.

// printf(), fprintf(), and puts() 
#include <stdio.h> 
// exit(), malloc(), and scanf() 
#include <stdlib.h> 

#define PERSONNE_ERROR 0 
#define PERSONNE_OK  1 

typedef struct personne { 
    // fixed width for 49 characters and the trailing NUL 
    char nom[50]; 
    int age; 
} personne; 

int saisie_personne_suivante(struct personne *x) 
{ 
    // For the returns of the scanf()s. 
    // Because you always check the returns if available 
    // (well, actually: the returns of printf() et al. rarely get checked) 
    // preset it to a value meant to say "OK" 
    int res = PERSONNE_OK; 
    // UX: let the users know what they are supposed to do. 
    puts("Your name, please"); 
    // we have a fixed maximum size of name and we can set it here within scanf() 
    // scanf() returns the number of elements it parsed, *not* the number of characters 

    // sacnf() needs a pointer to the memory it is expected to put the value into. 
    // x->nom is already a pointer to a char array, no need to use "&" 
    if ((res = scanf("%49s", x->nom)) != 1) { 
    // we can return immediatly here. 
    // If we would need to cleanup (free memory, for example) we would 
    // set res to PERSONNE_ERROR and use a goto to jump at the place 
    // where all the cleanup happens. But that should be done if the clean-up 
    // is always the same (or could be sorted) and you need such cleanups 
    // more than just two or three times. 
    return PERSONNE_ERROR; 
    } 

    puts("Your age, too, if you don't mind."); 
    // x->age is not a pointer to an int, hence we need to prefix "&" 
    if ((res = scanf("%d", &x->age)) != 1) { 
    return PERSONNE_ERROR; 
    } 
    return res; 
} 

int main(void) 
{ 
    personne *ali; 
    int res; 

    // reserve momory for the struct 
    ali = malloc(sizeof(personne)); 
    // call function that fills the struct and check the return 
    if ((res = saisie_personne_suivante(ali)) != PERSONNE_OK) { 
    fprintf(stderr, "Something went wrong with saisie_personne_suivante()\n"); 
    exit(EXIT_FAILURE); 
    } 
    // print the content of struct personne 
    // you can feed printf() directly, no need to find the pointer to the memory 
    // holding the int 
    printf("Age: %d\n", ali->age); 
    // To print strings it needs to know the start of the string whcih needs to be 
    // a pointer and ali->nom is a pointer to the start of the string 
    printf("Name: %s\n", ali->nom); 
    // free allocated memory (not really necessary at the end of the 
    // program but it's deemed good style and because it costs us nothing 
    // we cannot find a good reason to skip it) 
    free(ali); 
    // exit with a value that tells the OS that this programm ended without an error 
    // It shoudl be 0 (zero) which it almost always is. 
    // *Almost* always 
    exit(EXIT_SUCCESS); 
} 

Aber wirklich: gehen und ein paar Anfänger Buch/Tutorial zu bekommen. Ich kann Ihnen keine Empfehlung geben, weil ich nichts über gute in Ihrer Muttersprache weiß (manchmal ist die englische Version gut, aber die Übersetzung fehlt sehr).

+0

wenn wir 3 Personen wollen?personne saisie_clavier (personn * c, int num) { \t int i = 0; \t für (i = 0; i nom); \t scanf ("% d", & c-> Alter); \t \t} \t zurück * c; \t} – Cod3r

+0

@ Cod3r die Schleife ist ein guter Anfang, aber Sie brauchen eine Struktur für jede Person und speichern diese Strukturen auch irgendwo. Eine Möglichkeit besteht darin, eine so genannte Linked List zu verwenden, die hier beschrieben wird http://stackoverflow.com/documentation/c/560/linked-lists#t=20161009201717057921 aber Google könnte ein wenig nützlicher sein, um Informationen über verknüpfte Listen in zu finden C. – deamentiaemundi

Verwandte Themen