Δημοσιεύτηκε: 29 Ιούλ 2011, 12:43
Δυστυχώς παραβιάζεις μια από τις βασικές αρχές της sscanf (παραθέτω το σχετικό απόσπασμα από την τεκμηρίωση της συνάρτησης στον gcc 2.7)
GNU libc 2.7 έγραψε:
...
The behavior of this function is undefined if copying takes place between objects that overlap—for example, if s is also given as an argument to receive a string read under control of the ‘%s’, ‘%S’, or ‘%[’ conversion.
Γιατί χρησιμοποιείς το array και ως 1ο και ως 3ο όρισμα της sscanf (δεν έδωσα πουθενά τέτοιο παράδειγμα :p). Επίσης, τι ρόλο παίζει εκείνο το %d που έχεις κολλήσει μετά από το %c στο 2ο όρισμα;
Γενικώς διακρίνω μια τάση σου να περιπλέκεις αχρείαστα τα παραδείγματα που δίνω. Δεν έχω όμως καταλάβει αν αυτό οφείλεται στην ανήσυχη φύση σου ή στο ότι δεν καταλαβαίνεις τα παραδείγματα που δίνω (τείνω να πιστέψω το 2ο, χωρίς να είμαι φυσικά σίγουρος).
Το array σου (που στα δικά μου παραδείγματα το ονομάζω inbuf, ή buffer) πρέπει να το χρησιμοποιήσεις απλά για να διαβάσεις μέσα του την γραμμή της κύριας εισόδου (είτε με την fgets είτε με την s_get) και να το περάσεις μετά στην sscanf ως 1ο της όρισμα. Όποιες μεταβλητές θέλεις να "τραβήξεις" μέσα από το array θα πρέπει να τις έχεις δηλωμένες ξεχωριστά και να περάσεις τις διευθύνσεις τους ως 3ο (4ο, 5ο, κλπ) όρισμα της sscanf, με τα αντίστοιχα % στο 2ο όρισμα της sscanf.
έγραψε:
τωρα σχετικα με αυτα που μου ειπες.... δηλαδη αν βαλω εγω... την fgets μετα θα βαλω μονο την sscanf και καμια απο τις get_char ή s_get?????έγραψε:
EDIT: αΚΥΡο.. την s_get την θελω ουτως η αλλως γιατι χρησιμοποιειται και στις αλλες συναρτησεις.... λοιπον κοιτα εγω το εκανα ετσι......Spoiler: show
Κάνεις το ίδιο σφάλμα, περνάς το buffer και ως 1ο και ως 3ο όρισμα στην sscanf.
Αν θες να κρατήσεις μονάχα τον 1ο χαρακτήρα του διαβασμένου buffer σε μια δική σου μεταβλητή c είτε πάρε τον απευθείας με: c = *buffer; (ή: c = buffer[0]; ) ή χρησιμοποίησε την sscanf: sscanf(buffer, "%c", &c);
Μια φιλική συμβουλή αν μου επιτρέπεις, ειδικά τώρα στην αρχή μην προσπαθείς να σκέφτεσαι "out of the box".