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

C++ (cin)


babel47

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

Δημοσ.

Τα exceptions είναι όντως καλή λύση το θέμα είναι πως δεν ξερω πως να τα χρησιμοποιησω μπορει να βοηθησει καποιος? Οι exceptions που θα χρειαστω που βρισκονται στο ios::failbit?

 

Μπορει να μου εξηγησει πως θα μπορουσα να πιασω αυτο το σφαλμα με μια exception η να δημιουργησω ενα ερρορ handler για αυτη την περιπτωση?

 

>
char* a = new char[10];
cout << "dose string\n";
cin >> a;

Λογικα πρεπει να υπαρχει καποιος τροπος να κανω clear το cin μολις ξεπερασει το οριο της μεταβλητης a

  • Απαντ. 38
  • Δημ.
  • Τελ. απάντηση
Δημοσ.

Τα exceptions είναι όντως καλή λύση το θέμα είναι πως δεν ξερω πως να τα χρησιμοποιησω μπορει να βοηθησει καποιος? Οι exceptions που θα χρειαστω που βρισκονται στο ios::failbit?

 

Μπορει να μου εξηγησει πως θα μπορουσα να πιασω αυτο το σφαλμα με μια exception η να δημιουργησω ενα ερρορ handler για αυτη την περιπτωση?

 

>
char* a = new char[10];
cout << "dose string\n";
cin >> a;

Λογικα πρεπει να υπαρχει καποιος τροπος να κανω clear το cin μολις ξεπερασει το οριο της μεταβλητης a

Δημοσ.

Ελπίζω να κατάλαβα κάλα πιο είναι το πρόβλημα σου. Μια μικρή παρατήρηση. Μάθε να δουλέυεις με 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. Πρέπει να είναι όλα μαζί σε ένα αρχείο.

Δημοσ.

Ελπίζω να κατάλαβα κάλα πιο είναι το πρόβλημα σου. Μια μικρή παρατήρηση. Μάθε να δουλέυεις με 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. Πρέπει να είναι όλα μαζί σε ένα αρχείο.

Δημοσ.

Σ'ευχαριστω πολυ πιθανο να χρησιμοποιησω 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 και στην συνεχεια να του ξαναζηταω να δωσει αριθμο. Δυστυχως ο κωδικας που εχω γραψει παραπανω μπαινει σε απειρη λουπα αν δωσω γραμμα απο την κονσολα. Μπορει καποιος να με βοηθησει?

Δημοσ.

Βασικά υπάρχει πιο εύκολος τρόπος:

 

>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");

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

Δημοσ.

Αν χρησιμοποιησω τον τροπο σου στον κωδικα μου -επειδη υπαρχουν πολλες γραμμες κωδικα και μετα το συγκεκριμενο cin- μπαινει μεν στο if με το fail και αναγνωριζει το λαθος αλλα στην συνεχεια με πεταει εξω και δεν συνεχιζει την υπολοιπη εκτελεση.

 

Εχω την εντυπωση που μου κραταει την εισοδο η cin (το γραμμα) και το τροφοδοτει στο cin που εχω παρακατω. Ενα cin.clear() που δοκιμασα μεσα στο if ( cin.fail() ) δεν εκανε κατι. Καμια ιδεα?

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

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

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