babel47 Δημοσ. 29 Ιανουαρίου 2009 Μέλος Δημοσ. 29 Ιανουαρίου 2009 Τα exceptions είναι όντως καλή λύση το θέμα είναι πως δεν ξερω πως να τα χρησιμοποιησω μπορει να βοηθησει καποιος? Οι exceptions που θα χρειαστω που βρισκονται στο ios::failbit? Μπορει να μου εξηγησει πως θα μπορουσα να πιασω αυτο το σφαλμα με μια exception η να δημιουργησω ενα ερρορ handler για αυτη την περιπτωση? > char* a = new char[10]; cout << "dose string\n"; cin >> a; Λογικα πρεπει να υπαρχει καποιος τροπος να κανω clear το cin μολις ξεπερασει το οριο της μεταβλητης a
babel47 Δημοσ. 29 Ιανουαρίου 2009 Μέλος Δημοσ. 29 Ιανουαρίου 2009 Τα exceptions είναι όντως καλή λύση το θέμα είναι πως δεν ξερω πως να τα χρησιμοποιησω μπορει να βοηθησει καποιος? Οι exceptions που θα χρειαστω που βρισκονται στο ios::failbit? Μπορει να μου εξηγησει πως θα μπορουσα να πιασω αυτο το σφαλμα με μια exception η να δημιουργησω ενα ερρορ handler για αυτη την περιπτωση? > char* a = new char[10]; cout << "dose string\n"; cin >> a; Λογικα πρεπει να υπαρχει καποιος τροπος να κανω clear το cin μολις ξεπερασει το οριο της μεταβλητης a
3c0r1z Δημοσ. 29 Ιανουαρίου 2009 Δημοσ. 29 Ιανουαρίου 2009 Ελπίζω να κατάλαβα κάλα πιο είναι το πρόβλημα σου. Μια μικρή παρατήρηση. Μάθε να δουλέυεις με std::string και τις μεθόδους που έχει αυτή η κλάση. Δεν ξέρω πόσο παιδεύεσε με char* ή char[] δεν αξίζει τον κόπο IMHO βεβαίως βεβαίως. Here we go λοιπόν. > #include <iostream> // για τα std::cout και std::cin #include <string> // για std::string #include <sstream> // για std::stringstream template<typename T> T StringToNumber(const std::string& input, T& res); void CheckInput(std::string& temp, const long len); int main() { std::string input; CheckInput(input, 8); long num = 0L; StringToNumber<long>(input, num); std::cout << num << '\n'; return 0; } // Μετατρέπει έναν οποινδήποτε αριθμό // σε string. Δεν κάνει κάποιον έλεγχο // μήπως η συμβολοσειρά περιέχει τπτ // εκτός απο αριθμούς template<typename T> T StringToNumber(const std::string& input, T& res) { std::stringstream tmp; tmp << input; tmp >> res; return res; } // Η συνάρτηση αυτή απλώς ελέγχει αν // η συμβολοσειρά έχει τον απαιτούμενο // αριθμό ψηφίων. Μετά ελέγχει αν έχει // μόνο αριθμητικά ψηφία void CheckInput(std::string& temp, const long len) { bool RightInput = false; const std::string delims("0123456789"); while(!RightInput) { std::cout << "Dwse enan arithmo. Ews " << len << " psifia:"; std::cin >> temp; if(temp.size() > len) continue; if( temp.find_first_not_of(delims) != std::string::npos) { temp.clear(); continue; } else RightInput = !RightInput; } } YΓ. Αν θέλεις να χρησιμοποιήσεις το template γενικά δεν μπορείς να χρησιμοποιήσεις τον διαχωρισμό που κάνεις με κλάσεις σε *.hpp/*.cpp. Πρέπει να είναι όλα μαζί σε ένα αρχείο.
3c0r1z Δημοσ. 29 Ιανουαρίου 2009 Δημοσ. 29 Ιανουαρίου 2009 Ελπίζω να κατάλαβα κάλα πιο είναι το πρόβλημα σου. Μια μικρή παρατήρηση. Μάθε να δουλέυεις με std::string και τις μεθόδους που έχει αυτή η κλάση. Δεν ξέρω πόσο παιδεύεσε με char* ή char[] δεν αξίζει τον κόπο IMHO βεβαίως βεβαίως. Here we go λοιπόν. > #include <iostream> // για τα std::cout και std::cin #include <string> // για std::string #include <sstream> // για std::stringstream template<typename T> T StringToNumber(const std::string& input, T& res); void CheckInput(std::string& temp, const long len); int main() { std::string input; CheckInput(input, 8); long num = 0L; StringToNumber<long>(input, num); std::cout << num << '\n'; return 0; } // Μετατρέπει έναν οποινδήποτε αριθμό // σε string. Δεν κάνει κάποιον έλεγχο // μήπως η συμβολοσειρά περιέχει τπτ // εκτός απο αριθμούς template<typename T> T StringToNumber(const std::string& input, T& res) { std::stringstream tmp; tmp << input; tmp >> res; return res; } // Η συνάρτηση αυτή απλώς ελέγχει αν // η συμβολοσειρά έχει τον απαιτούμενο // αριθμό ψηφίων. Μετά ελέγχει αν έχει // μόνο αριθμητικά ψηφία void CheckInput(std::string& temp, const long len) { bool RightInput = false; const std::string delims("0123456789"); while(!RightInput) { std::cout << "Dwse enan arithmo. Ews " << len << " psifia:"; std::cin >> temp; if(temp.size() > len) continue; if( temp.find_first_not_of(delims) != std::string::npos) { temp.clear(); continue; } else RightInput = !RightInput; } } YΓ. Αν θέλεις να χρησιμοποιήσεις το template γενικά δεν μπορείς να χρησιμοποιήσεις τον διαχωρισμό που κάνεις με κλάσεις σε *.hpp/*.cpp. Πρέπει να είναι όλα μαζί σε ένα αρχείο.
babel47 Δημοσ. 30 Ιανουαρίου 2009 Μέλος Δημοσ. 30 Ιανουαρίου 2009 Σ'ευχαριστω πολυ πιθανο να χρησιμοποιησω string γιατι δεν εχω βρει λυση ετσι οπως το εχω κανει μεχρι τωρα. Στην περιπτωση που διαβαζω απο την κονσολα cin >> a; οπου a εστω int ή double , υπαρχει καποιο exception με το οποιο μπορω να προλαβω τον χρηστη εαν εισαγει χαρακτηρες (abc) , ωστε να μην βραχυκυκλωσει ο κωδικας? -----Προστέθηκε 30/1/2009 στις 05 : 34 : 42----- Έχω γράψει τον παρακάτω κωδικα: > float f; R:; cout<<"Give float: "; cin.exceptions(std::ios::eofbit|std::ios::failbit|std::ios::badbit); try { cin>>f; } catch(const std::ios::failure& e) {cout<<e.what()<<'\n'; cin.clear(); goto R;} αυτο που προσπαθω να κανω ειναι στην περιπτωση που ο χρηστης δεν εισαγει αριθμο(πχ γραμματα) ή εισαγει αριθμο αλλα πολυ μεγαλο να μπορω να το πιασω με την catch και στην συνεχεια να του ξαναζηταω να δωσει αριθμο. Δυστυχως ο κωδικας που εχω γραψει παραπανω μπαινει σε απειρη λουπα αν δωσω γραμμα απο την κονσολα. Μπορει καποιος να με βοηθησει?
PavelX Δημοσ. 30 Ιανουαρίου 2009 Δημοσ. 30 Ιανουαρίου 2009 Βασικά υπάρχει πιο εύκολος τρόπος: >int a = 0; cout << "Enter number: "; cin >> a; cout << endl; if (cin.fail()) { a = -1; cout << "ERROR" << endl; } else { cout << "value of a is: " << a << endl; } system("pause"); Προσωπικά το χρησιμοποιώ να δω αν αντί για αριθμό, έβαλε κάποιο γράμμα.
babel47 Δημοσ. 31 Ιανουαρίου 2009 Μέλος Δημοσ. 31 Ιανουαρίου 2009 Αν χρησιμοποιησω τον τροπο σου στον κωδικα μου -επειδη υπαρχουν πολλες γραμμες κωδικα και μετα το συγκεκριμενο cin- μπαινει μεν στο if με το fail και αναγνωριζει το λαθος αλλα στην συνεχεια με πεταει εξω και δεν συνεχιζει την υπολοιπη εκτελεση. Εχω την εντυπωση που μου κραταει την εισοδο η cin (το γραμμα) και το τροφοδοτει στο cin που εχω παρακατω. Ενα cin.clear() που δοκιμασα μεσα στο if ( cin.fail() ) δεν εκανε κατι. Καμια ιδεα?
PavelX Δημοσ. 31 Ιανουαρίου 2009 Δημοσ. 31 Ιανουαρίου 2009 Άλλαξέ το ως εξής: >int a = 0; cout << "Enter number: "; cin >> a; cout << endl; if (cin.fail()) {[b] cin.clear(); cin.ignore(256, '\n');[/b] a = -1; cout << "ERROR" << endl; } else { cout << "value of a is: " << a << endl; } system("pause"); Πηγή: http://cplus.about.com/od/learning1/ss/clessontwo_8.htm
babel47 Δημοσ. 31 Ιανουαρίου 2009 Μέλος Δημοσ. 31 Ιανουαρίου 2009 Σ'ευχαριστω πολυ, οσο κιαν εψαξα στο google δεν ετυχε να πεσω πανω του..
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.