2017-12-14 4 views
0

Die Übung gibt ein einfaches Programm-Datenbanken zu erstellen, und dieses Programm dreht sich um die folgende StrukturC: Wie ändert man die maximale Größe eines Strings in einer Struktur?

struct Address { 
    int id; 
    int set; 
    char name[MAX_DATA]; 
    char email[MAX_DATA]; 
}; 

ich gefragt werde, um den Code zu ändern, so kann ich die maximale Länge von .name auf das Programm als Argument übergeben und . Nun, natürlich, wenn statt MAX_DATA als ein Makro zu definieren, ich arbeite mit ihm als eine globale Variable, bekomme ich die Fehler: Variable geändert 'Name' bei Dateibereich.

Dann habe ich versucht, anders zu erstellen, wenn Schleifen durch den MAX_DATA Wert zu übergeben Ziel struct Address neu zu definieren, zum Beispiel:

if(argc > 6) { 
    int maxdata = atoi(argv[6]); 
    struct Address { 
    int id; 
    int set; 
    char name[maxdata]; 
    char email[maxdata]; 
    }; 
    DatabaseSet(conn, id, argv[4], argv[5]); 
    DatabaseWrite(conn); 
    break; 
} 

aber DatabaseSet und DatabaseWrite (die Arbeit an einem struct Connection, die auf einem anderen struct Database beziehen, die schließlich bezieht sich direkt auf struct Address) ignorieren Sie die neuen Längen von name und email.

BEARBEITEN: DANKE.

Ihnen allen für Ihre Kommentare und Antworten danken, Ihr mir wirklich geholfen, die mit der Ausübung und mit meinem allgemeinen undestanding von C.

+5

Sie können diese Art von Variabilität in der Struktur nicht so haben. Was Sie tun können, ist die dynamische Speicherzuweisung für die Zeichenfolgen ('malloc()' und friends; vielleicht 'strdup()') und Zeiger auf den dynamisch zugewiesenen Speicher ('char * name;') in der Struktur zu speichern. –

+1

Wenn zum Zeitpunkt der Kompilierung keine Beschränkung für die Länge des Namens und der E-Mail-Adresse bekannt ist, können Sie diese Elemente nicht als Arrays deklarieren. Mache sie stattdessen zu Poitern. –

+0

Abhängig von dem vollständigen Kontext, kann es sein, dass die "Pause" am Ende des "if" nicht notwendig ist. –

Antwort

5
struct Address { 
    int id; 
    int set; 
    char *name; 
    char *email; 
    }; 

Dann Speicher zuweisen dynamisch in name und email auf der Grundlage Ihrer MAXDATA Eingang.

Dann tun Sie dies struct Address p.

Und

p.name = malloc(MAXDATA); 
if(p.name == NULL){ 
    fprintf(stderr,"%s\n","Error in memory allocation"); 
    exit(1); 
} 

und dann, wenn Sie mit ihm fertig sind, arbeiten

free(p.name); 

Falls Sie Speicher reservieren für email werden Sie free() auf es die vernünftige Art und Weise, wie gezeigt nennen müssen, bevor .

+0

nicht vergessen, "frei (p.email)" –

+0

@ChristianGibbons .: Yep das ist implizit impliziert.Ich habe eine Reihe von Aktionen für 'name' gezeigt. – coderredoc

+0

Ja, ich habe gerade gemerkt, dass du auch im malloc-Befehl mit 'p.name' tiefer gegangen bist. –

Verwandte Themen