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

πρόβλημα με gets()


dinak

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

Δημοσ.

έχω τον εξής κώδικα:

 

>#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...δε μπορώ να βρω κάποιο λάθος :/

Δημοσ.

Ποτέ μα ποτέ μην χρησιμοποιείς αυτή τη συνάρτηση. Χρησιμοποιήσε την fgets στην θέση της με παράμετρο το stdin.

Δημοσ.
Ποτέ μα ποτέ μην χρησιμοποιείς αυτή τη συνάρτηση. Χρησιμοποιήσε την fgets στην θέση της με παράμετρο το stdin.

 

το έκανα και αυτό...αλλά τίποτα...τελικά το βρήκα το λάθος...πρώτον τη μεταβλητή string την έβαλα Pointer ενώ πρέπει να είναι πινακάκι και δεύτερον για την strtok πρέπει να ορίσω έναν καινούργιο Pointer :)

Δημοσ.

Δεν πειράζει που δεν είναι πινακάκι, αλλά κάντην malloc πρήν τη χρησιμοποιήσεις στην gets().

Η gets() δεν είναι κακή συνάρτηση, μια χαρά είναι.

Σημείωση για strtok: η strtok είναι "καταστροφική" συνάρτηση!!!! Αλλάζει δεδομένα, αν έχεις κανά const string και φρέσκο compiler (π.χ. visual studio 2008 express) μπορεί να σκάει κι'ολας.

Δημοσ.

>#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....

Δημοσ.

Δεν κάνεις κανένα έλεγχο αν η strtok επιστρέφει κάτι ή NULL.

Δεν κάνεις κανένα έλεγχο αν χωρά εκει που το αντιγράφεις.

Υπάρχουν πολλά σημεία για segmentation fault στο πρόγραμμα σου.

Δημοσ.
Δεν κάνεις κανένα έλεγχο αν η strtok επιστρέφει κάτι ή NULL.

Δεν κάνεις κανένα έλεγχο αν χωρά εκει που το αντιγράφεις.

Υπάρχουν πολλά σημεία για segmentation fault στο πρόγραμμα σου.

 

η είσοδος που βάζω είναι στάνταρ πάντα οπότε και η strtok πρέπει να μου επιστρέφει κάτι πάντα και χωράνε εκεί που τα αντιγράφω....

Δημοσ.
η είσοδος που βάζω είναι στάνταρ πάντα οπότε και η strtok πρέπει να μου επιστρέφει κάτι πάντα και χωράνε εκεί που τα αντιγράφω....

 

τότε κάνε και κανένα malloc για το persentage για να μην γραφεις στο γάμο του καργκιόζη...:-D

 

Πολύ-πολύ προσοχη με τους pointer. Αν δες τους βάλεις να δείχνουν κάπου που έχει χώρο, είναι θέμα τύχης πως θα σκάσει το πρόγραμμα

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

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

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