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

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

Δημοσ.

Γεια σας, προσπαθώ να βγάλω ένα project και αντιμετωπίζω την εξής δυσκολία. Θέλω να κάνω scanf έναν χαρακτήρα, και αν η τιμή δεν είναι a,A,b,B,c,C,q ή Q να κάνει ξανά scanf. Ο κώδικάς μου:

 

scanf ("%c", &ch);

while ((ch!="a")&&(ch!="A")&&(ch!="b")&&(ch!="B")&&(ch!="c")&&(ch!="C")&&(ch!="q")&&(ch!="Q"))

{

scanf ("%c", &ch);

}

 

Το τρέχω, και είτε βάζω τους "επιθυμητούς" χαρακτήρες είτε όχι ο βρόγχος εκτελείται. Μπορείτε να μου πείτε τι φταίει; (μην με κοροιδέψετε αν είναι απλό, είμαι α εξάμηνο :D )

Δημοσ.

Δεν θελει && που σημαινει AND αλλά || που σημαίνει OR. 

 

Δε νομιζω να εχεις αλλο λάθος αλλα εχω να ασχοληθω με C δεκαετια και βαλε. 

Δημοσ.

ναι γνωρίζω τους τελεστές.. πώς θέλει or; αφού πρέπει ΟΛΑ να ισχύουν για να δουλέψει ο βρόγχος..

Δε μπορεί μία μεταβλητή να είναι ταυτόχρονα 15 πράγματα.

 

Αντί για "a", "Α" κλπ βάλε 'a', 'A', ... Το δοκίμασα και έτσι δουλεύει.

Δουλεύει γιατί τα '' είναι για χαρακτήρες. Ο τύπος έλεγχε άλλα πράγματα με τις ανισότητες. Πράγματα σκοτείνα.

  • Like 3
Δημοσ.

Δε μπορεί μία μεταβλητή να είναι ταυτόχρονα 15 πράγματα.

Μπορεί όμως να ΜΗΝ είναι 15 πράγματα ταυτόχρονα :D αφού έχω βάλει != που σημαίνει διάφορο.

  • Like 1
Δημοσ. (επεξεργασμένο)

Ειναι αντιαισθητική και δυσανάγνωστη ολοκληρη η συνθηκη ετσι που την έχεις. Για να γλιτώσεις απο τα κεφαλαια βάλε την tolower οποτε εσωτερικα οτι και να δίνει ο χρηστης θα μετατρέπεται σε μικρό. 

 

scanf (" %c", &ch);
ch = tolower(ch); // ή ch = getchar(tolower(ch)); απευθειας χωρις την πρωτη scanf.
while ( ch > 'c' || ch == 'q')
{
scanf (" %c", &ch); // skip '\n' character.
} 

// Δοκιμασε και έτσι αμα θές while( ch == 'a' || ch == 'b' || ch == 'c' || ch =='q') { ... }  
 

Δες μηπως δουλεύει έτσι. 

 

ΥΓ Τα "a" και 'a' στην C ειναι τελειως διαφορετικά. Το πρωτο ειναι συμβολοσειρά δηλαδη ο χαρακτήρας a και ο '\0' το δευτερο ειναι μονο ο χαρακτήρας a. 

 

EDIT: Μη ξεχνάς οτι θα διαβάσει και το ENTER που θα δώσεις. Για αυτο έχει προστεθει ένα κενο σκοπιμα μέσα στην scanf πριν τον προσδιοριστη για τον χαρακτήρα.

 

 

Και αυτο  κανει skip τον new line αμα θες να το έχεις στα υποψη για αλλη χρηση :

 
while( ch = (getchar(tolower(ch)) == '\n' ) ) ;

Tο ; ειναι ένα κενο statement. Οσο ειναι αληθης η συνθηκη δεν κάνει τιποτα απλα τρέχει ενας βροχος και θα "σπασει" μολις ο χρηστης δωσει εναν χαρακτηρα διαφορετικο απο το ENTER. 

Επεξ/σία από DDevil
Δημοσ.

Δουλεύει γιατί τα '' είναι για χαρακτήρες. Ο τύπος έλεγχε άλλα πράγματα με τις ανισότητες. Πράγματα σκοτείνα.

 

:D  :D  :D  :D  :D  :D

  • Like 1

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...