migf1 έγραψε:Star_Light έγραψε:BΑΣΙΚΑ εγω εχω ξεκινησει και λυνω τις ασκησεις του βιβλιου του Γκιουρδα μαθετε την C σε 24 ωρες... το ειχα βγαλει σαν θεωρια (και λιγο απο ασκησεις φετος το χειμωνα) και τωρα πιανω οσες δεν ειχα κανει... εχει 24 ενοτητες... συνολικα χθες το επιασα... και εχω φτασει στην 8
εχω μια απορια ομως...
- Κώδικας: Επιλογή όλων
#include<stdio.h>
int main()
{
int x=' ';
printf("To programma tha sunexizei tin ektelesi tou mexri na dwsete ton xaraktira K \n\n");
while(x!='K')
{
printf("Dwste enan xaraktira H TO K GIA termatismo: ");
x=getchar();
putchar(x);
}
return 0;
}
ξερω πως αν βγαλω την printf εξω απο την while θα δουλευει καλα... αλλα τωρα δεν μπορω να καταλαβω γιατι ενω την εχω μεσα την βγαζει διπλη... πχ αντι να σου ζηταει μια φορα να εισαγεις εναν χαρακτηρα εμφανιζει το μηνυμα "Dwste enan xaraktira H TO K GIA termatismo: "
2 φορες :/
Υποφέρει από το πρόβλημα με τα απομεινάρια στο input buffer της κύριας εισόδου. Δυστυχώς από τη στιγμή που σε περιβάλλον Posix η fflush(stdin) δεν λειτουργεί, ή θα πρέπει να δοκιμάζετε τις ασκήσεις σε Windows προσθέτοντας ένας fflush(stdin) πριν από κάθε getchar() (ή πριν από κάθε scanf() ή οποιαδήποτε στάνταρ συνάρτηση διαβάσματος) ή θα πρέπει να απενεργοποιήσετε το line-buffering της κύριας εισόδου στο τερματικό σας (αυτό όμως δεν θα δουλεύει σε Windows).
Ένας τρόπος για να δουλεύει παντού είναι να διαβάζουμε την κάθε γραμμή της κύριας εισόδου μονοκόματα σε ένα δικό μας string (είτε με fgets() είτε καλύτερα με την s_get() που έχω δώσει κώδικα πολλές φορές) και κατόπιν να διαχειριζόμαστε μόνοι μας τις όποιες μεταβλητές θέλουμε να ξεχωρίσουμε από τη γραμμή που διαβάσαμε.
Για διάβασμα απλών χαρακτήρων από την κύρια είσοδο, όπως είναι το παράδειγμα που δίνεις, ευτυχώς αυτό δεν είναι και τόσο δύσκολο να το κάνουμε. Αντί να διαβάζουμε το x με getchar() ως char θα τον διαβάζουμε ως μεγάλο string μεγάλου (255 ωφέλιμων χαρακτήρων) και απλά μετά θα χρησιμοποιούμε τον 1ο του χαρακτήρα για τη σύγκριση στο while-loop.
Δηλαδή (άσχετο: έβαλα κι ένα \n μπροστά, στο printf() μέσα στο while, για να αφήνει γραμμή πριν τυπώσει):
- Κώδικας: Επιλογή όλων
#include<stdio.h>
int main( void )
{
char x[255+1] = "";
printf("To programma tha sunexizei tin ektelesi tou mexri na dwsete ton xaraktira K \n\n");
while( x[0] != 'K')
{
printf("\nDwste enan xaraktira H TO K GIA termatismo: ");
fgets(x, 256, stdin);
putchar( x[0] );
}
return 0;
}
Ή επειδή σε ένα οποιοδήποτε string αν βάλουμε ένα αστέρι μπροστά από το όνομά του αναφερόμαστε ουσιαστικά στον 1ο του χαρακτήρα, το παραπάνω μπορούμε να το γράψουμε και ως εξής:
- Κώδικας: Επιλογή όλων
#include<stdio.h>
int main( void )
{
char x[255+1] = "";
printf("To programma tha sunexizei tin ektelesi tou mexri na dwsete ton xaraktira K \n\n");
while( *x != 'K')
{
printf("\nDwste enan xaraktira H TO K GIA termatismo: ");
fgets(x, 256, stdin);
putchar( *x );
}
return 0;
}
Χρησιμοποιήστε όποιο από τα 2 καταλαβαίνετε καλύτερα!
Αν αισθάνεστε έτοιμοι να διαχειρίζεστε μόνοι σας τη κύρια γραμμή εισόδου, θα είναι χρήσιμο να μονιμοποιήσετε 4 πράγματα σε όλα σας τα προγράμματα, και να μάθετε από τώρα που είναι νωρίς να μετατρέπετε τη γραμμή εισόδου στις μεταβλητές που χρειάζεστε (έστω κι αν στην αρχή απλά θα αποστηθίσετε αυτά τα 4 πράγματα).
1. τον ορισμό μια σταθεράς για το μέγιστο μήκος της γραμμής εισόδου, συμπεριλαμβανομένου του '\0' στο τέλος (πάντα μεγάλο μήκος, π.χ. 255+1)
2. τη συνάρτηση s_get() (χρησιμοποιήστε την έτοιμη όπως σας την δίνω, απλά την κάνετε copy & paste σε όλα σας τα προγράμματα)
3. χρήση ενός string για το διάβασμα κάθε εισόδου από το χρήστη.
4. γέμισμα των μεταβλητών σας από τα κομμάτια της γραμμής εισόδου που διαβάσετε από τον χρήστη
Δηλαδή στο παραπάνω παράδειγμα:
- Κώδικας: Επιλογή όλων
#include<stdio.h>
#define MAXINBUF (255+1) // μέγιστο μήκος γραμμής εισόδου
// -----------------------------------------------------------------------------
// Διάβασμα της γραμμής εισόδου στο string s (μέχρι len-1 χαρακτήρες)
//
char *s_get(char *s, size_t len)
{
char *cp;
for (cp=s; (*cp=getc(stdin)) != '\n' && (cp-s) < len-1; cp++ )
; // for-loop with empty body
*cp = '\0'; // null-terminate last character
return s;
}
// -----------------------------------------------------------------------------
int main( void )
{
char inbuf[ MAXINBUF ] = ""; // string για μονοκόμματο διάβασμα γραμμής εισόδου
char x = ' ';
printf("To programma tha sunexizei tin ektelesi tou mexri na dwsete ton xaraktira K \n\n");
while( x != 'K')
{
printf("\nDwste enan xaraktira H TO K GIA termatismo: ");
s_get(inbuf, MAXINBUF); // διάβασμα γραμμής εισόδου στο inbuf
x = *inbuf; // κρατάμε στη μεταβλητή μας μόνο ότι χρειαζόμαστε
putchar( x );
}
return 0;
}
Για να μετατρέπετε το string της γραμμή εισόδου σε int χρησιμοποιήστε την: atoi(), για float/double την atof(), για long την atol().