Προς το περιεχόμενο

Προβλημα με λιστα στη C


HouseMusicFan

Προτεινόμενες αναρτήσεις

Δημοσ.

Παιδια εχω προβλημα με 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;
       }

  • Απαντ. 34
  • Δημ.
  • Τελ. απάντηση
Δημοσ.

Συνήθως chars αντιγράφεις με strcpy, Επίσης τώρα κάτι που παρατηρώ, στο struct σου μέσα το filename είναι char filename; δηλαδή ένας χαρακτήρας, μήπως ήθελες να γράψεις char *filename; ?

Δημοσ.

> 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. :/

Δημοσ.

Πάντως οφείλω να το ομολογήσω οτι επιτέλους βλέπω έναν topic starter ο οποίος γράφτηκε πιστεύω με μοναδικό λόγο να ρωτήσει κάτι, και δεν περίμενε την απάντηση έτοιμη απο εμάς. Τελευταία (υποθέτω λόγω εξεταστικής περιόδου) είχα αρχίσει να εκνευρίζομαι με όλες τι εκφωνήσεις ασκήσεων.

 

λίγο offtopic...

Δημοσ.

Το βρηκα το λαθος μου! ^_^ Τελικα ο κωδικας ειναι ετσι

> 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;
                                       }

οποτε προχωραω να κανω και αλλους κομβους! :D

Δημοσ.

Φαίνεται να έχεις πρόβλημα με τα strings γενικότερα! Εννοώ δεν έχεις μάθει τι είναι και πως δουλεύουν, με αποτέλεσμα να τα ορίζεις με αρχικοποίηση ενός μόνο χαρακτήρα και κατόπιν να προσπαθείς να διαβάσεις μέσα τους περισσότερους χαρακτήρες.

 

Ένα από αυτά σου το υπέδειξε ήδη ο παπι. Λίγο πιο κάτω το ξανά κάνεις πάλι, με τα name[]={0}, str[]={0} κλπ. Θα σου συνιστούσα πριν παιδευτείς κι άλλο, να ξαναδιαβάσεις τι είναι και πως δουλεύουν τα strings.

 

Πιστεύω θα σε βοηθήσει να βρεις τα λάθη σου (εγώ έριξα μια γρήγορη ματιά στον κώδικά σου, αλλά είναι τόσα πολλά τα ασύμβατα πράματα που κάνεις με τα strings που δεν μπορώ να ψάξω να τα βρω ένα-ένα).

 

Σε γενικές γραμμές, τα strings που θες να χρησιμοποιήσεις να τα ορίζεις ΠΑΝΤΑ με το μέγιστο μήκος τους! Επίσης, αν θες να χρησιμοποιήσεις δείκτη σε χαρακτήρες, να τον ορίζεις ως τέτοιον και όχι ως string. Γενικώς γίνεται ένας μύλος εκεί μέσα. Ακόμα και μόνο σε επίπεδο σύνταξης, είναι τελείως αποπροσανατολιστικός αυτός ο κώδικας.

 

ΥΓ. Επίσης, καλό είναι όλες τις μεταβλητές και τις δομές σου να τις ορίζεις στην αρχή της main() ώστε να μπορούμε κι υπόλοιποι (και πρωτίστως εσύ) να διαβάζουμε τον κώδικα και να καταλαβαίνουμε πάνω-κάτω τι παίζει από το 1ο... σκαν του ματιού μας ;)

Δημοσ.

Βασικα προερχομαι απ τη θετικη και εχω καποια θεματα ακομη με το προγραμματισμο γενικοτερα τα οποια σκοπευω να λυσω μεσα στο καλοκαιρι δεδομενου οτι η C μοιαζει με τη ψευδογλωσσα του λυκειου.Παντως καθε κριτικη ειναι αποδεκτη ^_^ !

Δημοσ.

Αν έχεις χρόνο και διάθεση, ρίξε μια ματιά σε αυτές τις 3 δημοσιεύσεις όπου προσπαθώ να εξηγήσω όσο πιο απλά μπορώ τα περί strings στη C (ή έστω την 1η από αυτές) ;)

 

ΥΓ. Κάτι ακόμα, για κάθε malloc() που κάνεις, πρέπει πριν τερματίσεις το πρόγραμμά σου να κάνεις κι ένα αντίστοιχο free().

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...