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

Πρόβλημα με scanf και character σε if statement


Dark_Sage

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

Δημοσ.

>#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

Δημοσ.

Τι εννοείς ξαναμπαίνει στο loop? Εφόσον είναι μέσα σε while και δεν βγαίνει από αυτό, θα εκτελείται συνεχεια το loop. Αυτός δεν είναι ο σκοπός του while?

 

Επίσης λες ότι άμα το char είναι d τότε break.. Γιατί δεν βάζεις while(ch!='d')?

Δημοσ.
>#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'

Δημοσ.

Οκ παιδια σορρυ διορθωνω

 

To ζήτημα ειναι πως οταν δώσω Π.χ a, θα κανει τα prints που πρέπει για το a αλλα θα ξαναμπει στο loop ΑΥΤΟΜΑΤΑ χωρις να με ξαναρωτήσει για scanf και απο τις δοκιμές μου ξαναμπαινει κ το ch έχει παρει την τιμή '\n' και (αφου εχει κανει το continue αφου το \n δεν ειναι a, b, c, d) με ξαναρωταει για scanf

δλδ να ενα output δίνοντας μια φορα το a:

 

Give me a char

a

Got an a

Give me a char

Lathos epilogi

Give me a char

Δημοσ.

Γνωμη μου ειναι να το κανεις σε μια while(ch!='d') να βαζεις ολα τα if μεσα και στο τελος ενα scanf παλι...

 

EDIT

 

Μια αλλη ιδεα για να μην εχεις το θεμα με το /n ειναι να το ορισεις string και να τσεκαρεις παντα το ch[0]...Ειναι χαζος ο τροπος αλλα λεμε τωρα...

Δημοσ.

Παιδια το προβλημα λύθηκε, ήθελε απλά αντί για %c στο scanf %s... μπορει καποιος να μου εξηγήσει γιατι με το %c το προγραμμα ειχε αυτη τη συμπεριφορά?

Δημοσ.

Άκου λοιπόν πιο είναι το πρόβλημα!

 

H scanf είναι μια συντόμευση της fscanf, φτιαγμένη να διαβάζει από

το stdin.

 

Στήν "είσοδο" λοιπόν υπάρχει ένα buffer που αποθηκεύει προσωρινά

τους χαρακτήρες που πατάς μέχρι να πατήσεις το enter.

 

Αυτό όμως που επιστρέφεται δεν είναι ένας χαρακτήρας, αλλά όλα όσα

πάτησες ακόμα και το '\n'. Εσύ στην scanf με το '%c' διαβάζεις ένα μόνο

χαρακτήρα ενώ στην πραγματικότητα υπάρχουν 2!

 

Οπότε, όταν κάνει αυτό που περιμένεις να κάνει και γυρνάει πίσω

στην scanf, δεν έχει αδειάσει το buffer με αποτέλεσμα να διαβάζεις

το '\n' σαν ξεχωριστό χαρακτήρα!

 

Για να το καταλάβεις καλύτερα, δοκίμασε να τρέξεις το αρχικό σου

πρόγραμμα με είσοδο 'ab'. Θα κάνει ότι πρέπει για το 'a' μετά για το

'b' μετά για το '\n' και τέλος θα περιμένει τη νέα σου είσοδο!

 

Όταν βάζεις το %s διαβάζεις ένα string. Οπότε καταναλώνει όλη την είσοδο.

Αν όμως δεν αλλάξεις τίποτα άλλο στον κώδικα σου έχεις ένα ύπουλο λάθος!

Κάνεις %s σε έναν char!!! Ενώ δε σου βγάζει κάποιο λάθος στο compile μπορεί

να κρεμάσει την ώρα που το τρέχεις γιατί βγαίνεις εκτός των ορίων μνήμης που

δεσμεύεται για ένα char.

 

Θα επανέλθω με μια πιο σωστή version για τον κώδικα που θες!

(Ώρα φαγητού, φωνάζει η μαμά!)

Δημοσ.

+1 for Bab1s.

 

Ένας απλός τρόπος να διορθώσεις τον κώδικά σου είναι να γράψεις τη scanf ως εξής:

 

>
scanf(" %c", &ch);

 

Έχει προστεθεί απλά ένα κενό πριν το %c.

 

Αυτό έχει σαν αποτέλεσμα το \n που θα έχει "περισέψει" στον buffer από όσα διάβασε η προηγούμενη scanf να "αντιστοιχιστεί" στον κενό χαρακτήρα στο format string, και άρα στη μεταβλητή ch να μπεί ο σωστός χαρακτήρας.

Δημοσ.

Για να μη σου γράφω ολόκληρο ο πρόγραμμα ξανά, διάβασε εδώ

 

http://www.opengroup.org/onlinepubs/009695399/functions/fgets.html

 

και δοκίμασε να το χρησιμοποιήσεις. Είναι πιο γενική συνάρτηση από την

scanf και παράλληλα σου δίνει κάποια ασφάλεια όσον αφορά το ότι

ορίζεις μέχρι πόσους χαρακτήρες θα διαβάσεις από την είσοδο.

 

Στο παράδειγμα που δίνει, αντί για 'fp' σαν τελευταίο όρισμα πρέπει να

βάλεις το 'stdin' για να διαβάσεις από το πληκτρολόγιο.

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

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

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