HouseMusicFan Δημοσ. 31 Μαΐου 2011 Δημοσ. 31 Μαΐου 2011 Παιδια εχω προβλημα με 1 λιστα στη C.Eως τωρα το εχω βαλει να διαβαζει 1 αρχειο κειμενου οποθ καθε γραμμη περιεχει το ονομα ενος αρχειου και το μεγεθος του.Καθε κομβος της λιστας θα περιεχει το ονομα και το μεγεθος.Οταν ομως παω να τυπωσω τον 1ο κομβο μου πεταει Segmentation δεν δεν ξερω το γιατι.Καμια ιδεα? > #include <stdio.h> #include <string.h> #include <stdlib.h> int main ( void ) { char filename[]={0}; int size; printf("Please give me the file's name:"); scanf("%s", filename); FILE *file = fopen (filename, "r" ); if ( file != NULL ) { typedef struct node { char filename; int filesize; struct node *next; }List; List *root; root=malloc(sizeof(List)); char line [15]; /* or other suitable maximum line size */ while (fgets ( line, sizeof line, file)!= NULL) { int x=0; char str[] ={}; *str=*line; char * pch; pch = strtok (str," "); while (pch != NULL) { char *name=pch; if(x==0) { printf ("%s",name); pch = strtok (NULL, " "); x++; } else { size=atoi(pch); printf("%5d\n",size); pch = strtok (NULL, " "); x++; root->filename=*name; root->filesize=size; root->next=NULL; while(root!=NULL) { printf("%s %d\n",root->filename, root->filesize); root=root->next; } break; } } break; } fclose ( file ); } else { perror ( filename ); } return 0; }
Technology fan Δημοσ. 31 Μαΐου 2011 Δημοσ. 31 Μαΐου 2011 Σε ποιά γραμμή στο βγάζει? To πιθανότερο να χεις κάπου null pointer exception
HouseMusicFan Δημοσ. 31 Μαΐου 2011 Μέλος Δημοσ. 31 Μαΐου 2011 while(root!=NULL) { printf("%s %d\n",root->filename, root->filesize); root=root->next; } Το προβλημα ειναι σε αυτο το loop.Αλλα δεν βλεπω το γιατι.
Technology fan Δημοσ. 31 Μαΐου 2011 Δημοσ. 31 Μαΐου 2011 Δοκίμασε λίγο να κάνεις print μόνο το root->filesize , πάλι έχει πρόβλημα?
HouseMusicFan Δημοσ. 31 Μαΐου 2011 Μέλος Δημοσ. 31 Μαΐου 2011 Πραγματι δουλεψε!Ευχαριστω πολυ! Αρα κατι τρεχει με το filename.Mαλλον ο pointer δειχνει στον γαμο του καραγκιοζη.
Technology fan Δημοσ. 31 Μαΐου 2011 Δημοσ. 31 Μαΐου 2011 Συνήθως chars αντιγράφεις με strcpy, Επίσης τώρα κάτι που παρατηρώ, στο struct σου μέσα το filename είναι char filename; δηλαδή ένας χαρακτήρας, μήπως ήθελες να γράψεις char *filename; ?
HouseMusicFan Δημοσ. 31 Μαΐου 2011 Μέλος Δημοσ. 31 Μαΐου 2011 > while (pch != NULL) { char name[]={0}; if(x==0) { strcpy(name,pch); printf ("%s",name); pch = strtok (NULL, " "); x++; } else { size=atoi(pch); printf("%5d\n",size); pch = strtok (NULL, " "); x++; root->filename=*name; root->filesize=size; root->next=NULL; while(root!=NULL) { printf("%s %d\n",root->filename,root->filesize); root=root->next; } break; Το αλλαξα και πλεον ειναι ετσι.Αλλα εξακολουθει να μην τυπωνει το filename. :/
παπι Δημοσ. 31 Μαΐου 2011 Δημοσ. 31 Μαΐου 2011 >typedef struct node { char filename[256];//<---- int filesize; struct node *next; }List;
HouseMusicFan Δημοσ. 31 Μαΐου 2011 Μέλος Δημοσ. 31 Μαΐου 2011 Μισο γιατι το εχασα.Αν το κανω με πινακα μετα 8α ειναι root->*filename=name; ?
panosxry Δημοσ. 31 Μαΐου 2011 Δημοσ. 31 Μαΐου 2011 αν το έκανες έτσι: (?) >strcpy(root->filename, name);
Technology fan Δημοσ. 31 Μαΐου 2011 Δημοσ. 31 Μαΐου 2011 Πάντως οφείλω να το ομολογήσω οτι επιτέλους βλέπω έναν topic starter ο οποίος γράφτηκε πιστεύω με μοναδικό λόγο να ρωτήσει κάτι, και δεν περίμενε την απάντηση έτοιμη απο εμάς. Τελευταία (υποθέτω λόγω εξεταστικής περιόδου) είχα αρχίσει να εκνευρίζομαι με όλες τι εκφωνήσεις ασκήσεων. λίγο offtopic...
HouseMusicFan Δημοσ. 31 Μαΐου 2011 Μέλος Δημοσ. 31 Μαΐου 2011 Το βρηκα το λαθος μου! Τελικα ο κωδικας ειναι ετσι > char name[]={0}; while (pch != NULL) { if(x==0) { strcpy(name,pch); printf ("%s",name); pch = strtok (NULL, " "); x++; } else { size=atoi(pch); printf("%5d\n",size); pch = strtok (NULL, " "); x++; root->filename=name; root->filesize=size; root->next=NULL; while(root!=NULL) { printf("%s %d\n",root->filename, root->filesize); root=root->next; } break; } οποτε προχωραω να κανω και αλλους κομβους!
migf1 Δημοσ. 31 Μαΐου 2011 Δημοσ. 31 Μαΐου 2011 Φαίνεται να έχεις πρόβλημα με τα strings γενικότερα! Εννοώ δεν έχεις μάθει τι είναι και πως δουλεύουν, με αποτέλεσμα να τα ορίζεις με αρχικοποίηση ενός μόνο χαρακτήρα και κατόπιν να προσπαθείς να διαβάσεις μέσα τους περισσότερους χαρακτήρες. Ένα από αυτά σου το υπέδειξε ήδη ο παπι. Λίγο πιο κάτω το ξανά κάνεις πάλι, με τα name[]={0}, str[]={0} κλπ. Θα σου συνιστούσα πριν παιδευτείς κι άλλο, να ξαναδιαβάσεις τι είναι και πως δουλεύουν τα strings. Πιστεύω θα σε βοηθήσει να βρεις τα λάθη σου (εγώ έριξα μια γρήγορη ματιά στον κώδικά σου, αλλά είναι τόσα πολλά τα ασύμβατα πράματα που κάνεις με τα strings που δεν μπορώ να ψάξω να τα βρω ένα-ένα). Σε γενικές γραμμές, τα strings που θες να χρησιμοποιήσεις να τα ορίζεις ΠΑΝΤΑ με το μέγιστο μήκος τους! Επίσης, αν θες να χρησιμοποιήσεις δείκτη σε χαρακτήρες, να τον ορίζεις ως τέτοιον και όχι ως string. Γενικώς γίνεται ένας μύλος εκεί μέσα. Ακόμα και μόνο σε επίπεδο σύνταξης, είναι τελείως αποπροσανατολιστικός αυτός ο κώδικας. ΥΓ. Επίσης, καλό είναι όλες τις μεταβλητές και τις δομές σου να τις ορίζεις στην αρχή της main() ώστε να μπορούμε κι υπόλοιποι (και πρωτίστως εσύ) να διαβάζουμε τον κώδικα και να καταλαβαίνουμε πάνω-κάτω τι παίζει από το 1ο... σκαν του ματιού μας
HouseMusicFan Δημοσ. 31 Μαΐου 2011 Μέλος Δημοσ. 31 Μαΐου 2011 Βασικα προερχομαι απ τη θετικη και εχω καποια θεματα ακομη με το προγραμματισμο γενικοτερα τα οποια σκοπευω να λυσω μεσα στο καλοκαιρι δεδομενου οτι η C μοιαζει με τη ψευδογλωσσα του λυκειου.Παντως καθε κριτικη ειναι αποδεκτη !
migf1 Δημοσ. 31 Μαΐου 2011 Δημοσ. 31 Μαΐου 2011 Αν έχεις χρόνο και διάθεση, ρίξε μια ματιά σε αυτές τις 3 δημοσιεύσεις όπου προσπαθώ να εξηγήσω όσο πιο απλά μπορώ τα περί strings στη C (ή έστω την 1η από αυτές) ΥΓ. Κάτι ακόμα, για κάθε malloc() που κάνεις, πρέπει πριν τερματίσεις το πρόγραμμά σου να κάνεις κι ένα αντίστοιχο free().
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.