maniac89 Δημοσ. 3 Αυγούστου 2008 Δημοσ. 3 Αυγούστου 2008 παιδιά κοιτάξτε το παρακάτω απλό προγραμματάκι,το μονο που θέλω να κάνω είναι να εμφανίσω καποια ονόματα σε λίστα....μπερδεύομαι όμως με τα strings. προκαταβολικά thanks!!! #include <stdio.h> struct node { char name; struct node *next; }; struct node *root; int main(int argc,char* argv[]) { struct node *list; list=(struct node*)malloc(sizeof(struct node)); list->name='Kostas'; //κάπου εδώ το χάνω list->next=NULL; root=list; for(list=root;list!=NULL;list=list->next) { printf("%s\n",list->name); } return 0; }
Aesmade Δημοσ. 3 Αυγούστου 2008 Δημοσ. 3 Αυγούστου 2008 Το char μπορεί να κρατήσει μόνο έναν χαρακτήρα, οπότε θα πρέπει να αλλάξεις το char name σε char *name. Επίσης, τα ' (single quotes) χρησιμοποιούνται μόνο για έναν χαρακτήρα, για string θα πρέπει να χρησιμοποιήσεις " (double quotes), οπότε θα γίνει list->name="Kostas". Το υπόλοιπο πρόγραμμα δεν το κοίταξα, πάντως το πρόβλημα με τα strings πιστεύω αυτό είναι.
Directx Δημοσ. 3 Αυγούστου 2008 Δημοσ. 3 Αυγούστου 2008 Θα πρέπει καταρχήν να δεσμεύσεις ικανό χώρο στο node.name ώστε να χωρά το προς αποθήκευση όνομα (το ορίζω στατικά ως BUFSIZ από stdio.h -μια αρκετά μεγάλη τιμή, αν θες το κάνεις φυσικά και δυναμικά με το ανάλογο malloc). Ύστερα θα πρέπει να αποθηκεύσεις το όνομα "Kostas" (με " και όχι ') στο name, αυτό μπορεί να γίνει στην περίπτωση μας με την strcpy. Τέλος αποδεσμεύουμε την μνήμη που δεσμεύουμε (είθισται..) και ελέγχουμε πάντα για επιτυχία ή αποτυχία της malloc. > #include <stdio.h> #include <stdlib.h> #include <string.h> struct node { char name[bUFSIZ]; struct node *next; }; struct node *root; int main(int argc,char* argv[]) { struct node *list = NULL; list=(struct node*)malloc(sizeof(struct node)); if(list != NULL) { strcpy(list->name, "Kostas"); list->next=NULL; root=list; for(list=root;list!=NULL;list=list->next) printf("%s\n",list->name); } free(list); return 0; } Καλή συνέχεια. Υ.Γ. Με πρόλαβε ο Aesmade
maniac89 Δημοσ. 3 Αυγούστου 2008 Μέλος Δημοσ. 3 Αυγούστου 2008 ευχαριστώ!!!! σας λέω είχα τραβήξει γερό κόλλημα....
maniac89 Δημοσ. 3 Αυγούστου 2008 Μέλος Δημοσ. 3 Αυγούστου 2008 (γιατί άμα βάλω list->name="Kostas"; δεν το δέχεται?) (μόνο με την strcpy γίνεται??) ευχαριστώ....
Aesmade Δημοσ. 3 Αυγούστου 2008 Δημοσ. 3 Αυγούστου 2008 Αν το έκανες με char array, όπως στον κώδικα του Directx, δεν γίνεται απλώς να του κάνεις assign τη διεύθυνση ενός string. Θα πρέπει να χρησιμοποιήσεις έναν char pointer. > #include <stdio.h> #include <stdlib.h> struct node { char *name; struct node *next; }; struct node *root; int main(int argc,char* argv[]) { struct node *list; list=(struct node*)malloc(sizeof(struct node)); list->name="Kostas"; list->next=NULL; root=list; for(list=root;list!=NULL;list=list->next) { printf("%s\n",list->name); } return 0; }
unre@l Δημοσ. 4 Αυγούστου 2008 Δημοσ. 4 Αυγούστου 2008 Προσπάθησε να χρησιμοποιείς την strcpy και όχι απλά mypointer = "mystring" Μερικές φορές η συμπεριφορά του προγραμματος μπορεί να είναι απρόβλεπτη. Ίσως ο compiler αντιλαμβάνεται το "mystring" σαν const το οποίο εσυ το συνδέεις με εναν non to-const pointer.. οπώτε ίσως υπάρξουν προβλήματα άμα πάς στην συνέχεια να πειράξεις ένα γράμμα του string για παράδειγμα... Για να βγάλουμε λοιπόν όλα αυτά τα "ισως", "μερικές φορές", "μπορεί" κτλ απλά ... strcpy ftw
nikolakisgr Δημοσ. 5 Αυγούστου 2008 Δημοσ. 5 Αυγούστου 2008 Ρίξε μια ματιά και στο παρακάτω Link: http://c-faq.com/decl/strlitinit.html
Evgenios1 Δημοσ. 7 Αυγούστου 2008 Δημοσ. 7 Αυγούστου 2008 (γιατί άμα βάλω list->name="Kostas"; δεν το δέχεται?) (μόνο με την strcpy γίνεται??) ευχαριστώ.... char --> 256 σινδιασμοι Kostas - 26^6 σινδιασμοι πρεπει να ειναι char[10](καλυτερα παντος ειναι να χρισιμοποιηση το BUFSIZ για να μην υπαρχουν ασκοπα bytes )
Aesmade Δημοσ. 7 Αυγούστου 2008 Δημοσ. 7 Αυγούστου 2008 char --> 256 σινδιασμοιKostas - 26^6 σινδιασμοι πρεπει να ειναι char[10](καλυτερα παντος ειναι να χρισιμοποιηση το BUFSIZ για να μην υπαρχουν ασκοπα bytes ) Οι arrays είναι σαν constant pointers, δεν μπορείς απλώς να δώσεις καινούρια διεύθυνση σε μια array. Και να μπορούσες, το μέγεθος της array δεν θα μέτραγε, αφού θα της έδινες καινούρια διεύθυνση.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.