2016-04-21 30 views
0
int get_name() 
{ 
    char cName[] = "hello"; 
    int iCode, i = 0; 
    struct sign_in items[6];//array of six structure variables 

    Fpointin =fopen("namepass.txt","r"); 

    if (Fpointin == NULL) 
    { 
     printf ("File does not exist.\n"); 
    } 
    else 
    { 
     for (i=0;i<6;i++) 
     { 
      fscanf(Fpointin,"%s %d",items[i].name,items[i].password);//read all values from the file into th structure 
     } 
     printf("Here is the sign_in structure\n");//print the entirety of the sign_in structure 
     for (i=0;i<6;i++) 
     { 
      printf("name: %s\ncode: %d\n\n", items[i].name, items[i].password); 
     } 
    } 
    fclose(Fpointin); 
} 

Hey alle. Also habe ich diesen Codeabschnitt von einem Projekt und es stürzt ab, wenn ich versuche, es auszuführen. Ich versuche, Namen und ihre jeweiligen Passcodes von einer Datei zu einer Struktur zu lesen, und es funktioniert nicht. In der fscanf Zeile hatte ich die %s %d Bezeichner vertauscht und es lief, aber es gedruckt zufällige Sachen, die nicht einmal in der Nähe war, was in der Datei war. Irgendwelche Ideen? Struktur verursacht Programm zum Absturz


[Update von comment:]

struct sign_in 
{ 
    int password; //The password for each player 
    char name[]; //Name of the people who can sign in 
} 
+0

'fscanf (Fpointin,"% s% d ", Elemente [i] .name, Elemente [i] .password);' Ich vermute, dass das Kennwort eine Zeichenfolge ist. Wenn dies der Fall ist, müssen Sie "% s% s" 'für die Formatzeichenfolge verwenden. –

+7

Post 'struct sign_in' Definition – red0ct

+0

Wie poste ich Code im Kommentarbereich? – JMBTaylor

Antwort

1

Erste, Sie nicht char name[] in Ihrer Struktur verwendet werden soll. Weil das Array seine Speichergröße deklarieren sollte, bevor Sie es verwenden.

  1. char *name:

    So können Sie char name[] ändern, dass Sie eine Speichergröße für ihn zugeordnet haben. Überprüfen Sie meinen Code unten.

  2. char name[NAME_SIZE]

Zweite, wenn Sie den Wert in eine andere Funktion ändern möchten, sollten Sie seine Speicheradresse, um es passieren.zum Beispiel:

Beispiel 1:, wenn Sie nur den Wert übergeben, aber nicht

void foo(int in) 
{ 
    in = 5; 
} 

int main(int argc, char const *argv[]) 
{ 
    /* code */ 
    int a = 10; 
    foo(a); 
    printf("after foo, a: %d\n", a); 
    return 0; 
} 

Ausgangs Adresse: after foo, a: 10

Beispiel 2:, wenn Sie die Speicheradresse übergeben.

void foo(int *in) 
{ 
    *in = 5; 
} 

int main(int argc, char const *argv[]) 
{ 
    /* code */ 
    int a = 10; 
    foo(&a); 
    printf("after foo, a: %d\n", a); 
    return 0; 
} 

Ausgang: after foo, a: 5

So haben Sie items[i].password ‚s Speicheradresse zu übergeben fscanf wie:
fscanf(Fpointin,"%s %d",items[i].name, &items[i].password);

Daher sollte Ihr Code wie folgt aussieht:

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

struct sign_in { 
    int password;//The password for each player 
    char *name;//Name of the people who can sign in 
}; 

void init_myStruct(struct sign_in *s_in) { 
    s_in->name = calloc(1, sizeof(char)*1024); 
    return; 
} 

void destroy_myStruct (struct sign_in *s_in) { 
    free(s_in->name); 
    s_in->name = NULL; 
    return; 
} 

int get_name() 
{ 
    int i = 0; 
    FILE *Fpointin = NULL; 
    struct sign_in items[6];//array of six structure variables 

    for (i = 0; i < 6; i++) 
     init_myStruct(&items[i]); 

    Fpointin =fopen("namepass.txt","r"); 
    if (Fpointin == NULL) { 
     printf ("File does not exist.\n"); 
     goto end_of_use; 
    } 
    else 
    { 
     printf("Here is the sign_in structure\n");//print the entirety of the sign_in structure 
     for (i = 0; i < 6; i++) { 
      fscanf(Fpointin,"%s %d",items[i].name, &items[i].password);//read all values from the file into th structure 
      printf("name: %s\ncode: %d\n\n", items[i].name, items[i].password); 
     } 
    } 
    fclose(Fpointin); 

end_of_use: 
    for (i = 0; i < 6; i++) 
     destroy_myStruct(&items[i]); 
    return; 
} 

int main(int argc, char const *argv[]) 
{ 
    get_name(); 
    return 0; 
} 
2

Es wäre wirklich hilfreich sein, um zu sehen, was die Struktur sign_in aussieht. Aber von einem kurzen Blick auf den Code ist ein offensichtlicher Fehler die Art, wie das Passwort gescannt wird.

fscanf(Fpointin,"%s %d",items[i].name,items[i].password); 

sollte diese Linie sein:

fscanf(Fpointin,"%s %d",items[i].name, &items[i].password); 

Sie müssen [i] in der Adresse der variablen Elemente passieren .password so dass fscanf einen Wert in dem Speicherplatz von dieser Adresse darauf speichern kann .

Hoffe, dass hilft.

0

Es kann vom Typ char * sein, und Sie haben möglicherweise keinen Speicherplatz dafür zugewiesen. Es wird dann abstürzen definitiv

+0

Ich glaube nicht, dass ich jemals Typ char * verwendet habe. Bitte erkläre? – JMBTaylor

1

Die char name[]; in

struct sign_in 
{ 
    ... 
    char name[]; 

ist eines unvollständigen Typ. Es weist keinen Speicher zu.

Verwenden

#define NAME_LEN_MAX 42 

... 

struct sign_in 
{ 
    ... 
    char name[NAME_LEN_MAX + 1]; 

zum Beispiel und stellen die Abtastung wie folgt aus:

fscanf(Fpointin, "%42s %d", items[i].name, &items[i].password); 
+0

Funktioniert gut! Vielen Dank! – JMBTaylor