Dark_Sage Δημοσ. 9 Νοεμβρίου 2009 Δημοσ. 9 Νοεμβρίου 2009 >#include <stdio.h> #include <stdlib.h> int main () { char ch; do { printf("Give me a char\n"); scanf("%c", &ch); if ( ch == 'a' ) { printf("Got an a\n"); } else if ( ch == 'b' ) { printf("Got a b\n"); } else if ( ch == 'c' ) { printf("Got a c\n"); } else if ( ch == 'd' ) break; else { printf("Wrong\n"); continue; } } while (1); return 0; } Λοιπόν είναι ενα απλό προγραμματάκι αλλα πραγματικα δεν μπορω να βρω τι κανω λαθος. Διαβαζει εναν char και αναλογως τι του δώσεις κανει καποια απλα printf. To ζήτημα ειναι πως οταν δώσω Π.χ a, θα κανει τα prints που πρέπει αλλα θα ξαναμπει στο loop... απο καποιες δοκιμές οταν δίνω π.χ α, αυτο ειναι σαν να διαβαζει α\n και να ξανακανει το Loop και για '\n'... Τι κανω λαθος? ps: δοκίμασα και με ch = getchar(); τα ίδια thank you
macabre_sunsets Δημοσ. 9 Νοεμβρίου 2009 Δημοσ. 9 Νοεμβρίου 2009 Τι εννοείς ξαναμπαίνει στο loop? Εφόσον είναι μέσα σε while και δεν βγαίνει από αυτό, θα εκτελείται συνεχεια το loop. Αυτός δεν είναι ο σκοπός του while? Επίσης λες ότι άμα το char είναι d τότε break.. Γιατί δεν βάζεις while(ch!='d')?
jtsc21 Δημοσ. 9 Νοεμβρίου 2009 Δημοσ. 9 Νοεμβρίου 2009 >#include <stdio.h> #include <stdlib.h> int main () { char ch; do { printf("Starting"\n); scanf("%c", &ch); if ( ch == 'a' ) { //some printfs } else if ( ch == 'b' ) { //some printfs } else if ( ch == 'c' ) { //some printfs } else if ( ch == 'd' ) break; else { continue; } } while (1); return 0; } Λοιπόν είναι ενα απλό προγραμματάκι αλλα πραγματικα δεν μπορω να βρω τι κανω λαθος. Διαβαζει εναν char και αναλογως τι του δώσεις κανει καποια απλα printf. To ζήτημα ειναι πως οταν δώσω Π.χ a, θα κανει τα prints που πρέπει αλλα θα ξαναμπει στο loop... απο καποιες δοκιμές οταν δίνω π.χ α, αυτο ειναι σαν να διαβαζει α\n και να ξανακανει το Loop και για '\n'... Τι κανω λαθος? ps: δοκίμασα και με ch = getchar(); τα ίδια thank you Βασικά δεν καταλαβα ακριβως τι θες να κανει το προγραμμα σου... Παντως αν θες μπλις κανεις τα printf που θες μετα να βγαινει απο το while χρησιμοποιησε την εντολη break στο τελος της καθε if{} οπως και με το 'd'
Dark_Sage Δημοσ. 9 Νοεμβρίου 2009 Μέλος Δημοσ. 9 Νοεμβρίου 2009 Οκ παιδια σορρυ διορθωνω To ζήτημα ειναι πως οταν δώσω Π.χ a, θα κανει τα prints που πρέπει για το a αλλα θα ξαναμπει στο loop ΑΥΤΟΜΑΤΑ χωρις να με ξαναρωτήσει για scanf και απο τις δοκιμές μου ξαναμπαινει κ το ch έχει παρει την τιμή '\n' και (αφου εχει κανει το continue αφου το \n δεν ειναι a, b, c, d) με ξαναρωταει για scanf δλδ να ενα output δίνοντας μια φορα το a: Give me a chara Got an a Give me a char Lathos epilogi Give me a char
mitsosk2000 Δημοσ. 9 Νοεμβρίου 2009 Δημοσ. 9 Νοεμβρίου 2009 Γνωμη μου ειναι να το κανεις σε μια while(ch!='d') να βαζεις ολα τα if μεσα και στο τελος ενα scanf παλι... EDIT Μια αλλη ιδεα για να μην εχεις το θεμα με το /n ειναι να το ορισεις string και να τσεκαρεις παντα το ch[0]...Ειναι χαζος ο τροπος αλλα λεμε τωρα...
Dark_Sage Δημοσ. 9 Νοεμβρίου 2009 Μέλος Δημοσ. 9 Νοεμβρίου 2009 Παιδια το προβλημα λύθηκε, ήθελε απλά αντί για %c στο scanf %s... μπορει καποιος να μου εξηγήσει γιατι με το %c το προγραμμα ειχε αυτη τη συμπεριφορά?
bab1s Δημοσ. 9 Νοεμβρίου 2009 Δημοσ. 9 Νοεμβρίου 2009 Άκου λοιπόν πιο είναι το πρόβλημα! H scanf είναι μια συντόμευση της fscanf, φτιαγμένη να διαβάζει από το stdin. Στήν "είσοδο" λοιπόν υπάρχει ένα buffer που αποθηκεύει προσωρινά τους χαρακτήρες που πατάς μέχρι να πατήσεις το enter. Αυτό όμως που επιστρέφεται δεν είναι ένας χαρακτήρας, αλλά όλα όσα πάτησες ακόμα και το '\n'. Εσύ στην scanf με το '%c' διαβάζεις ένα μόνο χαρακτήρα ενώ στην πραγματικότητα υπάρχουν 2! Οπότε, όταν κάνει αυτό που περιμένεις να κάνει και γυρνάει πίσω στην scanf, δεν έχει αδειάσει το buffer με αποτέλεσμα να διαβάζεις το '\n' σαν ξεχωριστό χαρακτήρα! Για να το καταλάβεις καλύτερα, δοκίμασε να τρέξεις το αρχικό σου πρόγραμμα με είσοδο 'ab'. Θα κάνει ότι πρέπει για το 'a' μετά για το 'b' μετά για το '\n' και τέλος θα περιμένει τη νέα σου είσοδο! Όταν βάζεις το %s διαβάζεις ένα string. Οπότε καταναλώνει όλη την είσοδο. Αν όμως δεν αλλάξεις τίποτα άλλο στον κώδικα σου έχεις ένα ύπουλο λάθος! Κάνεις %s σε έναν char!!! Ενώ δε σου βγάζει κάποιο λάθος στο compile μπορεί να κρεμάσει την ώρα που το τρέχεις γιατί βγαίνεις εκτός των ορίων μνήμης που δεσμεύεται για ένα char. Θα επανέλθω με μια πιο σωστή version για τον κώδικα που θες! (Ώρα φαγητού, φωνάζει η μαμά!)
tespa_2002 Δημοσ. 10 Νοεμβρίου 2009 Δημοσ. 10 Νοεμβρίου 2009 +1 for Bab1s. Ένας απλός τρόπος να διορθώσεις τον κώδικά σου είναι να γράψεις τη scanf ως εξής: > scanf(" %c", &ch); Έχει προστεθεί απλά ένα κενό πριν το %c. Αυτό έχει σαν αποτέλεσμα το \n που θα έχει "περισέψει" στον buffer από όσα διάβασε η προηγούμενη scanf να "αντιστοιχιστεί" στον κενό χαρακτήρα στο format string, και άρα στη μεταβλητή ch να μπεί ο σωστός χαρακτήρας.
bab1s Δημοσ. 10 Νοεμβρίου 2009 Δημοσ. 10 Νοεμβρίου 2009 Για να μη σου γράφω ολόκληρο ο πρόγραμμα ξανά, διάβασε εδώ http://www.opengroup.org/onlinepubs/009695399/functions/fgets.html και δοκίμασε να το χρησιμοποιήσεις. Είναι πιο γενική συνάρτηση από την scanf και παράλληλα σου δίνει κάποια ασφάλεια όσον αφορά το ότι ορίζεις μέχρι πόσους χαρακτήρες θα διαβάσεις από την είσοδο. Στο παράδειγμα που δίνει, αντί για 'fp' σαν τελευταίο όρισμα πρέπει να βάλεις το 'stdin' για να διαβάσεις από το πληκτρολόγιο.
Dark_Sage Δημοσ. 10 Νοεμβρίου 2009 Μέλος Δημοσ. 10 Νοεμβρίου 2009 ευχαριστω παιδια παρα πολυ για τις απαντησεις σας!
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.