dinak Δημοσ. 18 Μαΐου 2009 Δημοσ. 18 Μαΐου 2009 έχω τον εξής κώδικα: >#include <stdio.h> #include <string.h> main(){ int number, *AA , **start, *percentage, i, j; char **title, **station, **finish, **duration, token[]="#", *string; printf("Eisagete ton arithmo twn metrisewn: "); scanf("%d", &number); start=(int **)malloc(number*sizeof(int *)); title=(char **)malloc(number*sizeof(char *)); station=(char **)malloc(number*sizeof(char *)); finish=(char **)malloc(number*sizeof(char *)); duration=(char **)malloc(number*sizeof(char *)); for(i=0;i<number;i++){ start[i]=(int *)malloc(5*sizeof(int)); title[i]=(char *)malloc(30*sizeof(char)); station[i]=(char *)malloc(20*sizeof(char)); finish[i]=(char *)malloc(5*sizeof(char)); duration[i]=(char *)malloc(5*sizeof(char)); } printf("Eisagete ta stoixeia: "); gets(string); string=strtok(string, token); while(string!=NULL){ puts(string); string=strtok(NULL, token); } system("pause"); } και μου βγάζει segmentation fault...δε μπορώ να βρω κάποιο λάθος :/
bokarinho Δημοσ. 18 Μαΐου 2009 Δημοσ. 18 Μαΐου 2009 Ποτέ μα ποτέ μην χρησιμοποιείς αυτή τη συνάρτηση. Χρησιμοποιήσε την fgets στην θέση της με παράμετρο το stdin.
dinak Δημοσ. 18 Μαΐου 2009 Μέλος Δημοσ. 18 Μαΐου 2009 Ποτέ μα ποτέ μην χρησιμοποιείς αυτή τη συνάρτηση. Χρησιμοποιήσε την fgets στην θέση της με παράμετρο το stdin. το έκανα και αυτό...αλλά τίποτα...τελικά το βρήκα το λάθος...πρώτον τη μεταβλητή string την έβαλα Pointer ενώ πρέπει να είναι πινακάκι και δεύτερον για την strtok πρέπει να ορίσω έναν καινούργιο Pointer
bxenos Δημοσ. 19 Μαΐου 2009 Δημοσ. 19 Μαΐου 2009 Δεν πειράζει που δεν είναι πινακάκι, αλλά κάντην malloc πρήν τη χρησιμοποιήσεις στην gets(). Η gets() δεν είναι κακή συνάρτηση, μια χαρά είναι. Σημείωση για strtok: η strtok είναι "καταστροφική" συνάρτηση!!!! Αλλάζει δεδομένα, αν έχεις κανά const string και φρέσκο compiler (π.χ. visual studio 2008 express) μπορεί να σκάει κι'ολας.
dinak Δημοσ. 20 Μαΐου 2009 Μέλος Δημοσ. 20 Μαΐου 2009 >#include <stdio.h> #include <string.h> main(){ int number, i, j, k; char *AA , **start, *percentage, **title, **station, **finish, **duration, token[]="#", string[200], *c; printf("Eisagete ton arithmo twn metrisewn: "); scanf("%d", &number); start=(char **)malloc(number*sizeof(char *)); title=(char **)malloc(number*sizeof(char *)); station=(char **)malloc(number*sizeof(char *)); finish=(char **)malloc(number*sizeof(char *)); duration=(char **)malloc(number*sizeof(char *)); for(i=0;i<number;i++){ start[i]=(char *)malloc(5*sizeof(char)); title[i]=(char *)malloc(30*sizeof(char)); station[i]=(char *)malloc(20*sizeof(char)); finish[i]=(char *)malloc(5*sizeof(char)); duration[i]=(char *)malloc(5*sizeof(char)); } for(i=0;i<number;i++){ printf("Eisagete ta stoixeia: "); fgets(string, 100, stdin); c=strtok(string, token); strcpy(AA, c); printf("%s\n", AA); c=strtok(NULL, token); strcpy(title[i], c); c=strtok(NULL, token); strcpy(station[i], c); c=strtok(NULL, token); strcpy(start[i], c); c=strtok(NULL, token); strcpy(finish[i], c); c=strtok(NULL, token); strcpy(duration[i], c); c=strtok(NULL, token); strcpy(percentage, c); } system("pause"); } ρε παιδιά δεν μπορώ να καταλάβω τι λάθος κάνω και μου βγάζει segmentation fault....
bxenos Δημοσ. 20 Μαΐου 2009 Δημοσ. 20 Μαΐου 2009 Δεν κάνεις κανένα έλεγχο αν η strtok επιστρέφει κάτι ή NULL. Δεν κάνεις κανένα έλεγχο αν χωρά εκει που το αντιγράφεις. Υπάρχουν πολλά σημεία για segmentation fault στο πρόγραμμα σου.
dinak Δημοσ. 20 Μαΐου 2009 Μέλος Δημοσ. 20 Μαΐου 2009 Δεν κάνεις κανένα έλεγχο αν η strtok επιστρέφει κάτι ή NULL.Δεν κάνεις κανένα έλεγχο αν χωρά εκει που το αντιγράφεις. Υπάρχουν πολλά σημεία για segmentation fault στο πρόγραμμα σου. η είσοδος που βάζω είναι στάνταρ πάντα οπότε και η strtok πρέπει να μου επιστρέφει κάτι πάντα και χωράνε εκεί που τα αντιγράφω....
bxenos Δημοσ. 20 Μαΐου 2009 Δημοσ. 20 Μαΐου 2009 η είσοδος που βάζω είναι στάνταρ πάντα οπότε και η strtok πρέπει να μου επιστρέφει κάτι πάντα και χωράνε εκεί που τα αντιγράφω.... τότε κάνε και κανένα malloc για το persentage για να μην γραφεις στο γάμο του καργκιόζη... Πολύ-πολύ προσοχη με τους pointer. Αν δες τους βάλεις να δείχνουν κάπου που έχει χώρο, είναι θέμα τύχης πως θα σκάσει το πρόγραμμα
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.