2013-04-11 3 views
-1

Quelqu'un peut-il me donner des indications sur la raison pour laquelle le tableau de structures ne s'imprime pas correctement?Tableau de Structs étrange sortie?

Je pense que c'est quelque chose à voir avec la mémoire que j'ai allouée à la structure que je ne suis pas sûr !!

En utilisant Mac OS X Mountain Lion Xcode 4 gcc

Merci pour toute aide complètement coincé !! (! S'il vous plaît patienter Je ne suis qu'un étudiant)

#include <stdio.h> 
#include <limits.h> 
#include <ctype.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 
#include <sys/types.h> 



typedef struct{ 
char* one; 
char* two; 
} Node; 

Node *nodes; 
int count = 0; 


//----------------------------------------------------------------------- 
void add(char *one,char*two){ 

char x[40]; 
char y[40]; 

printf("reached..\n"); 

strcpy(x,one); 
strcpy(y,two); 


printf("--> X: %s\n",x); 
printf("--> Y: %s\n",y); 

Node newNode; 
newNode.one = x; 
newNode.two = y; 
nodes[count]= newNode; 

count++; 
} 
//----------------------------------------------------------------------- 

//----------------------------------------------------------------------- 
void print(){ 

int x; 
for (x = 0; x < 10; x++) 
{ 
    printf("%d : (%s, %s) \n",x,nodes[x].one, nodes[x].two); 
} 

} 

//----------------------------------------------------------------------- 

//----------------------------------------------------------------------- 
void check(char **arg) 
{ 

if(strcmp(*arg, "Add") == 0) 
{ 

add(arg[1],arg[2]); 

}else if(strcmp(*arg,"print") == 0) 
{ 

print(); 
}else{ 
    printf("Error syntax Enter either: \n Add [item1][item2]\n OR \n print\n"); 
} 

} 
//----------------------------------------------------------------------- 
void readandParseInput(char *line,char **arg) 
{ 

    if (fgets (line, 512, stdin)!= NULL) { 


    char * pch; 
    pch = strtok (line," \n\t"); 
    int count = 0; 
    arg[0] = pch; 

    while (pch != NULL) 
    { 
    count++; 
    pch = strtok (NULL, " \n\t"); 
    arg[count] =pch; 
    } 


}else{ 
printf("\n"); 
exit(0); 
    } 

} 

//----------------------------------------------------------------------- 

int main() 
{ 


int size = 100; 
nodes = calloc(size, sizeof(Node)); 

int i; 
for(i = 0;i <100; i++){ 

printf("%s , %s \n",nodes[i].one,nodes[i].two); 
// nodes[i].one = "."; 
// nodes[i].two = "."; 
} 


char line[512];    /* the input line     */ 
char *arg[50];    /* the command line argument  */ 

while (1) 
{ 
    readandParseInput(line,arg); 
    if(arg[0] != NULL){ 
    check(arg); 
    } 

} 

return(0); 
} 
+0

quel est votre sortie? Vous pouvez mettre des points d'arrêt et utiliser la fenêtre de surveillance pour voir ce que font vos variables? – infinitloop

Répondre

0

Vous gardez des pointeurs vers les variables automatiques suivantes:

char x[40]; 
char y[40]; 

Ces hors de portée quand add() retours, vous laissant avec ballants pointeurs.

Vous devez activer Node::one et Node::two dans des tableaux ou leur attribuer de la mémoire sur le tas.

0

En fonction de votre choix add(), vous ne pouvez pas affecter un struct à un autre via un opérateur = ... vous devez copier ...

memcpy(&nodes[count], &newNode)

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

typedef struct { 
    char *fn; 
}NAME; 

#define NAME_LEN 20 

int main() 
{ 
    NAME name; 

    name.fn = (char *) calloc(NAME_LEN, sizeof(char)); 

    strcpy(name.fn, "Namco"); 

    printf("Name: %s\n", name.fn); 

    free(name.fn); 

    return 0; 
} 

vous ne pouvez pas affecter une chaîne comme ceci dans c

newNode.one = x; 
newNode.two = y; 

quoi est newNode.one faisant référence à ???

0

à fonction ajouter

newNode.one = x; 
newNode.two = y; 

à

newNode.one = strdup(x); 
newNode.two = strdup(y);