parsifal Δημοσ. 9 Δεκεμβρίου 2008 Δημοσ. 9 Δεκεμβρίου 2008 Όλο αυτό το μπέρδεμα ξεκίνησε από την επιλογή να δίνει ο χρήστης σώνει και καλά input που θα ερμηνεύεται ως char. Αν γίνει revert στην προηγούμενη λύση με int, δε θα υπάρχει κανένα απολύτως πρόβλημα...
Directx Δημοσ. 9 Δεκεμβρίου 2008 Δημοσ. 9 Δεκεμβρίου 2008 Ούτε αυτό βοηθάει, σπάει εύκολα αν ο χρήστης είναι ατίθασος στο input του.
parsifal Δημοσ. 9 Δεκεμβρίου 2008 Δημοσ. 9 Δεκεμβρίου 2008 Τίποτα που δε μπορείς να προβλέψεις με κατάλληλο έλεγχο νομίζω...
Directx Δημοσ. 9 Δεκεμβρίου 2008 Δημοσ. 9 Δεκεμβρίου 2008 .. με κατάλληλο ελέγχο λειτουργεί φυσικά αλλά έτσι λειτουργεί και η λύση των char οπότε καταλήγουμε ξανά στο ίδιο αποτέλεσμα. Δεν υπάρχει στην ANSI-C κάτι του στυλ getch() που σου επιστρέφει (non-echo στο stdout) τον χαρακτήρα που πάτησε ο χρήστης ώστε να τελειώνει η υπόθεση. Όπως επίσης δεν υπάρχει μια kbhit που σου επιτρέπει να ελέγχεις αν υπάρχουν δεδομένα στο stdin σου οπότε μπορείς να γράφεις άνετο κώδικα πχ. while(!kbhit()){ .. } κτλ. Οπότε ασχολούμαστε με τα ημίμετρα της stdio.h ...
parsifal Δημοσ. 9 Δεκεμβρίου 2008 Δημοσ. 9 Δεκεμβρίου 2008 Όχι, δε με έπιασες. Εννοούσα έλεγχο στη συνθήκη ανακύκλωσης του μενού, όχι για περιπτώσεις overflow κλπ που μπορεί να συμβούν με χρήση char...
Directx Δημοσ. 9 Δεκεμβρίου 2008 Δημοσ. 9 Δεκεμβρίου 2008 Όχι, δε με έπιασες. Εννοούσα έλεγχο στη συνθήκη ανακύκλωσης του μενού, όχι για περιπτώσεις overflow κλπ που μπορεί να συμβούν με χρήση char... α! οκ.. κατάλαβα (?).. ναι.. overflow έχουμε και με αριθμούς όταν δουλεύουμε με την scanf, για παράδειγμα "123 (κενό) 456" -> Boom το scanf ή αντί αριθμού εισαγωγή χαρακτήρα οπότε το scanf τρελαίνεται (μαζί με το stdin) και έχουμε λανθασμένα loops μετά μέχρι να καθαρίσει το stdin... Αν καταλαβαίνω τι εννοείς βέβαια. -- Γενικά η scanf είναι προβληματική για σοβαρό input, οπότε παραδοσιακά διαβάζουμε με gets ή ακόμα καλύτερα fgets (έλεγχος μεγέθους -φυσικά υπάρχει και το scanf("%Ns".. όπου N το max μέγεθος του char* μας) και επεξεργαζόμαστε μετά μόνοι τα δεδομένα είτε σαν tokens είτε με την sscanf κτλ.. Για απλά ή χαλαρά πράγματα (όπου εμπιστευόμαστε τον user) όμως η scanf είναι ok λύση.
parsifal Δημοσ. 9 Δεκεμβρίου 2008 Δημοσ. 9 Δεκεμβρίου 2008 Σε τέτοιες περιπτώσεις συμβαίνει overflow; Βοηθάει και το input formatting της scanf. Στην πρώτη: για παράδειγμα 123 456 ...θα αγνοήσει το 456, γιατί βρίσκεται μετά από white character (κενό). Στη δεύτερη: ή αντί αριθμού εισαγωγή χαρακτήρα (boom η scanf). ...δε θυμάμαι, θα πρέπει να το τσεκάρω. Συμφωνώ κατά τ' άλλα με το σχόλιο περί scanf. Είναι καλύτερη λύση η fscanf για περιορισμό του μεγέθους. Αν θυμάμαι καλά, η μείξη (f/s)printf/scanf και (f)puts/gets στο ίδιο πρόγραμμα δημιουργεί προβλήματα με τον χαρακτήρα <CR> που μένει στον keyboard buffer και διαβάζεται σε σημεία που δεν τον περιμένεις.
Directx Δημοσ. 9 Δεκεμβρίου 2008 Δημοσ. 9 Δεκεμβρίου 2008 Το input-format αν εννοείς τα εξειδικευμένα [^] & [ ] αυτά ομολογώ ότι προσεγγίζουν τις "μαύρες τέχνες" (χαριτολογώ βέβαια). Σαφώς είναι πολύ ισχυρά αφορούν όμως από όσο γνωρίζω char* input και είναι "λίγο" compiler depended ορισμένες φορές ρε παιδί μου.. -ενώ θα έπρεπε να δουλεύουν καμία φορά .. δεν δουλεύουν (ok είναι και από τα λιγότερο χρησιμοποιούμενα flags της scanf). To \n είναι πρόβλημα (πχ η fgets προσθέτει ένα..) - σε αυτές τις περιπτώσεις κάνεις flush το stdin (αλλά όπως είπα είναι OS depended).
ippo00 Δημοσ. 9 Δεκεμβρίου 2008 Δημοσ. 9 Δεκεμβρίου 2008 Μια λύση έιναι να κανεις capture όλα τα πράγματα από το πληκτρολόγιο και να τα κάνεις break, για αυτό έχω και το \n στο case, για να πιάσει το enter. Άσχετο, το i-- είναι μαλακία.. i=0 καλύτερα ;p
WordUp Δημοσ. 9 Δεκεμβρίου 2008 Μέλος Δημοσ. 9 Δεκεμβρίου 2008 Θα τσεκάρω μετά τα σχόλιά σας, γιατί είμαι λίγο βιαστικός. Όχι, δεν είναι κάποια άσκηση (δεν φοιτώ καν). Απλά είναι το πρώτο μου "real" πρόγραμμα έβερ, και θέλω να εξασκηθώ παράλληλα στο "έρορ χάντλινγκ"
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.