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

[C] Eπιστροφή στο πρώτο βήμα αν υπάρξει εισαγωγή λάθος δεδομένων


WordUp

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

Δημοσ.

Όλο αυτό το μπέρδεμα ξεκίνησε από την επιλογή να δίνει ο χρήστης σώνει και καλά input που θα ερμηνεύεται ως char. Αν γίνει revert στην προηγούμενη λύση με int, δε θα υπάρχει κανένα απολύτως πρόβλημα...

Δημοσ.

.. με κατάλληλο ελέγχο λειτουργεί φυσικά αλλά έτσι λειτουργεί και η λύση των char οπότε καταλήγουμε ξανά στο ίδιο αποτέλεσμα.

 

Δεν υπάρχει στην ANSI-C κάτι του στυλ getch() που σου επιστρέφει (non-echo στο stdout) τον χαρακτήρα που πάτησε ο χρήστης ώστε να τελειώνει η υπόθεση. Όπως επίσης δεν υπάρχει μια kbhit που σου επιτρέπει να ελέγχεις αν υπάρχουν δεδομένα στο stdin σου οπότε μπορείς να γράφεις άνετο κώδικα πχ. while(!kbhit()){ .. } κτλ. Οπότε ασχολούμαστε με τα ημίμετρα της stdio.h ...

Δημοσ.

Όχι, δε με έπιασες. Εννοούσα έλεγχο στη συνθήκη ανακύκλωσης του μενού, όχι για περιπτώσεις overflow κλπ που μπορεί να συμβούν με χρήση char...

Δημοσ.
Όχι, δε με έπιασες. Εννοούσα έλεγχο στη συνθήκη ανακύκλωσης του μενού, όχι για περιπτώσεις 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 λύση.

Δημοσ.

Σε τέτοιες περιπτώσεις συμβαίνει overflow; Βοηθάει και το input formatting της scanf. Στην πρώτη:

για παράδειγμα 123 456

...θα αγνοήσει το 456, γιατί βρίσκεται μετά από white character (κενό).

 

Στη δεύτερη:

ή αντί αριθμού εισαγωγή χαρακτήρα (boom η scanf).

...δε θυμάμαι, θα πρέπει να το τσεκάρω.

 

 

Συμφωνώ κατά τ' άλλα με το σχόλιο περί scanf. Είναι καλύτερη λύση η fscanf για περιορισμό του μεγέθους. Αν θυμάμαι καλά, η μείξη (f/s)printf/scanf και (f)puts/gets στο ίδιο πρόγραμμα δημιουργεί προβλήματα με τον χαρακτήρα <CR> που μένει στον keyboard buffer και διαβάζεται σε σημεία που δεν τον περιμένεις.

Δημοσ.

Το input-format αν εννοείς τα εξειδικευμένα [^] & [ ] αυτά ομολογώ ότι προσεγγίζουν τις "μαύρες τέχνες" (χαριτολογώ βέβαια). Σαφώς είναι πολύ ισχυρά αφορούν όμως από όσο γνωρίζω char* input και είναι "λίγο" compiler depended ορισμένες φορές ρε παιδί μου.. -ενώ θα έπρεπε να δουλεύουν καμία φορά .. δεν δουλεύουν (ok είναι και από τα λιγότερο χρησιμοποιούμενα flags της scanf).

 

To \n είναι πρόβλημα (πχ η fgets προσθέτει ένα..) - σε αυτές τις περιπτώσεις κάνεις flush το stdin (αλλά όπως είπα είναι OS depended).

Δημοσ.

Μια λύση έιναι να κανεις capture όλα τα πράγματα από το πληκτρολόγιο και να τα κάνεις break, για αυτό έχω και το \n στο case, για να πιάσει το enter.

Άσχετο, το i-- είναι μαλακία.. i=0 καλύτερα ;p

Δημοσ.

Θα τσεκάρω μετά τα σχόλιά σας, γιατί είμαι λίγο βιαστικός.

Όχι, δεν είναι κάποια άσκηση (δεν φοιτώ καν). Απλά είναι το πρώτο μου "real" πρόγραμμα έβερ, και θέλω να εξασκηθώ παράλληλα στο "έρορ χάντλινγκ" :-)

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

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

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