H ΓΛΩΣΣΑ C. Μάθηµα 15: Είσοδος/Έξοδος: Συναρτήσεις Εισόδου. ηµήτρης Ψούνης

Σχετικά έγγραφα
H ΓΛΩΣΣΑ C. Μάθηµα 16: Είσοδος/Έξοδος: Συναρτήσεις Eξόδου. ηµήτρης Ψούνης

scanf() scanf() stdin scanf() printf() int float double %lf float

Προγραμματισμός Ι. Χαρακτήρες. Πανεπιστήμιο Πελοποννήσου Τμήμα Πληροφορικής & Τηλεπικοινωνιών

Διαδικασιακός Προγραμματισμός

Επεξεργασία Αρχείων Κειµένου

Η πρώτη παράμετρος είναι ένα αλφαριθμητικό μορφοποίησης

Διαδικασιακός Προγραμματισμός

H ΓΛΩΣΣΑ C. Μάθηµα 1: Το Πρώτο µας Πρόγραµµα σε C. ηµήτρης Ψούνης

H ΓΛΩΣΣΑ C. Μάθηµα 17: Είσοδος/Έξοδος: Επικοινωνία µε το Λειτουργικό Σύστηµα. ηµήτρης Ψούνης

Η γλώσσα προγραμματισμού C

Δομημένος Προγραμματισμός

Η γλώσσα προγραμματισμού C

ΕΠΕΞΕΡΓΑΣΙΑ ΑΡΧΕΙΩΝ Λέµε αρχείο

Βιβλιοθήκη stdio. Προγραμματισμός II 1

Προγραμματισμός Ι. Είσοδος/Έξοδος. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Η γλώσσα προγραμματισμού C

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

ΑΣΚΗΣΗ 2: ΔΟΜΗ ΠΡΟΓΡΑΜΜΑΤΟΣ C, ΧΕΙΡΙΣΜΟΣ ΜΕΤΑΒΛΗΤΩΝ ΚΑΙ ΣΥΝΑΡΤΗΣΕΙΣ ΕΙΣΟΔΟΥ ΚΑΙ ΕΞΟΔΟΥ

H ΓΛΩΣΣΑ C. Μάθηµα 7: Πίνακες. ηµήτρης Ψούνης

Εισαγωγή στην C. Μορφή Προγράµµατος σε γλώσσα C

Εισαγωγή στον Προγραμματισμό

Κεφάλαιο Πίνακες Ι. ( ιάλεξη 15) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

Εισαγωγή στον προγραμματισμό. Τμήμα Πληροφορικής & Επικοινωνιών ΤΕΙ Σερρών Εργαστήριο 2

Η γλώσσα προγραμματισμού C

Διαδικασιακός Προγραμματισμός

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ & ΥΠΟΛΟΓΙΣΤΙΚΗ ΦΥΣΙΚΗ

ΕΡΓΑΣΤΗΡΙΟ 11 - Απαντήσεις

Ανάπτυξη και Σχεδίαση Λογισμικού

Λύβας Χρήστος Αρχική επιµέλεια Πιτροπάκης Νικόλαος και Υφαντόπουλος Νικόλαος

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #3

Βιβλιοθήκη stdio. Προγραμματισμός II 1

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4

Κεφάλαιο Αλφαριθµητικές Σειρές Χαρακτήρων (Strings)

Τεχνολογία και Προγραμματισμός Υπολογιστών. Η γλώσσα προγραμματισμού C

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΑΘΗΜΑ 2 Ο. Εισαγωγή στην C Εντολές εξόδου Εντολές εισόδου Μορφοποιητές ΣΙΝΑΤΚΑΣ Ι. ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

Η γλώσσα προγραμματισμού C

ΑΣΚΗΣΗ 7: ΑΛΦΑΡΙΘΜΗΤΙΚΑ

2.2.3 Η εντολή Εκτύπωσε

H ΓΛΩΣΣΑ C. Μάθηµα 8: είκτες. ηµήτρης Ψούνης

Κεφάλαιο , 3.2: Συναρτήσεις II. ( ιάλεξη 12) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

Διάλεξη 18η: Διαχείρηση Αρχείων

H ΓΛΩΣΣΑ C. Μάθηµα 12: υναµική έσµευση Μνήµης. ηµήτρης Ψούνης

Προγραμματισμός Ι (ΗΥ120)

Διαδικασιακός Προγραμματισμός

Προγραµµατισµός Ι Αλφαριθµητικά Πανεπιστήµιο Πελοποννήσου Τµήµα Πληροφορικής & Τηλεπικοινωνιών Προγραµµατισµός Ι 1 Νικόλαος Δ.

char name[5]; /* define a string of characters */

ΕΝΤΟΛΕΣ ΕΠΑΝΑΛΗΨΗΣ. for (παράσταση_1; παράσταση_2; παράσταση_3) εντολή επόμενη εντολή

Κεφάλαιο 3.1, : Συναρτήσεις I. ( ιάλεξη 11) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

ΕΡΓΑΣΤΗΡΙΟ 3: Προγραμματιστικά Περιβάλλοντα και το Πρώτο Πρόγραμμα C

Ανάπτυξη και Σχεδίαση Λογισμικού

ΕΡΓΑΣΤΗΡΙΟ 9: Συμβολοσειρές και Ορίσματα Γραμμής Εντολής

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

C Programming EPL032 Maria Stavrinou Ioannou Εισαγωγή στη Γλώσσα C

Τμήμα Πληροφορικής & Επικοινωνιών Δρ. Θεόδωρος Γ. Λάντζος

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

- program p_name(input) - uses crt

int array[10]; double arr[5]; char pin[20]; Προγραµµατισµός Ι

Προγραμματισμός Η/Υ (ΤΛ2007 )

S, (5, -3, 34, -23, 7) ( *, _

Εξοικ Εξ ε οικ ίωση ε με το το πρόγ ραμμα πρόγ DEV C++ Επικοι Επικ νωνία οι Χρήσ Χρήστη τη Υπολ Υπο ογισ λ τή

ΚΕΦΑΛΑΙΟ 9 ΒΑΣΙΚΕΣ ΕΝΤΟΛΕΣ

Διαδικαστικός Προγραμματισμός

#define, 70, 575 #elif, 580 #else, 580 #endif, 580 #error, 584 #if, 580 #ifdef, 583 #ifndef, 580, 583 #include, 70, 227, 574 #undef, 579

lab13grades 449 PASS 451 PASS PASS FAIL 1900 FAIL Page 1

Ενδεικτική περιγραφή μαθήματος

Εισαγωγή στους Αλγόριθμους και τον Προγραμματισμό. 3η Διάλεξη Είσοδος Δεδομένων Συνθήκες Βρόχοι Παραδείγματα

Δομημένος Προγραμματισμός (ΤΛ1006)

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

Εισαγωγή στην πληροφορική

Περιεχόμενα. Πρόλογος... 21

Η-Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ. Εργαστήριο 1 Εισαγωγή στη C. Σοφία Μπαλτζή s.mpaltzi@di.uoa.gr

Κεφάλαιο 8.7. Πολυδιάστατοι Πίνακες ( ιάλεξη 18) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

Α' Εξάμηνο ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

Κεφάλαιο 8.7. Πίνακες & Συναρτήσεις ( ιάλεξη 17) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

ιορθώσεις επί της 2 ης έκδοσης εκτύπωσης 2002

ΑΣΚΗΣΗ 2: ΧΕΙΡΙΣΜΟΣ ΜΕΤΑΒΛΗΤΩΝ ΣΤΗ C

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

ΑΡ Χ Ε Ι Α Κ Ε Ι Μ Ε Ν Ο Υ (text files)

Βαθμός Σχόλια. lab5 PASS PASS PASS PASS PASS. Οριακά PASS - Καλή δουλειά

Προγραμματισμός Η/Υ (ΤΛ2007 )

Μεταφερσιμότητα Τα προγράμματα μεταφέρονται εύκολα σε διαφορετικά λειτουργικά συστήματα

ΕΡΓΑΣΤΗΡΙΟ 1 ΕΙΣΑΓΩΓΗ ΣΤΗ C. Τµήµα Πληροφορικής και Τηλεπικοινωνιών

Βαθμός Σχόλια. lab PASS 1194 PASS 1238 PASS 1239 PASS

Προγραμματισμός H/Y Ενότητα 1: Εισαγωγή. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Συναρτήσεις πρότυπης βιβλιοθήκης 1. Μερικές συνήθεις συναρτήσεις βιβλιοθήκης int atoi(const char *p) int fclose(file *fp)

Προγραµµατισµός Ι (ΗΥ120)

Προγραμματισμός Ι. Προχωρημένα Θέματα. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

ΑΣΚΗΣΗ 5: ΠΙΝΑΚΕΣ. Σχήµα 1: H έννοια των πινάκων

7. ΕΙΣΑΓΩΓΗ ΣΤΙΣ ΣΥΝΑΡΤΗΣΕΙΣ

Η γλώσσα προγραμματισμού C

Κεφάλαιο Αλφαριθμητικές Σειρές Χαρακτήρων (Strings) (Διάλεξη 20) 1) Strings στη C

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

Εισαγωγή στον Προγραμματισμό

Προγραμματισμός Ι (ΗΥ120)

Διάλεξη 2: Επανάληψη Προγραμματισμού Συμβολοσειρές (strings) Διδάσκων: Παναγιώτης Ανδρέου

Κεφάλαιο VΙ: Προσπέλαση Αρχείων. 5.1 Αρχεία δεδομένων.

printf Οι κωδικοί (format codes) του printf για διάφορους τύπους δεδοµένων είναι:

Κεφάλαιο Πίνακες Ι. (Διάλεξη 16)

(Κεφάλαιο 2.7 και 12) Αρχεία στην C. ( ιάλεξη 13) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

Ινστιτούτο Επαγγελµατική Κατάρτιση Κορυδαλλού "ΤΕΧΝΙΚΟΣ ΣΥΣΤΗΜΑΤΩΝ ΥΠΟΛΟΓΙΣΤΩΝ" (Ερωτήσεις Πιστοποίησης στην γλώσσα προγραµµατισµού C)

Transcript:

H ΓΛΩΣΣΑ C Μάθηµα 15: Είσοδος/Έξοδος: Συναρτήσεις Εισόδου ηµήτρης Ψούνης

2 Περιεχόµενα Μαθήµατος Α. Ροές 1. Γενικά 2. Η ροή προκαθορισµένης εισόδου stdin 3. Η ροή προκαθορισµένης εξόδου stdout 4. Η ροή προκαθορισµένης εξόδου λαθών stderr Β. Συναρτήσεις ροής εισόδου stdin 1. Γενικά 2. Η συνάρτηση getchar() 3. Η συνάρτηση getch() 4. Η συνάρτηση getche() 5. H συνάρτηση ungetc() 6. Η συνάρτηση gets() 7. Η συνάρτηση fgets() 8. Η συνάρτηση scanf() 9. Η συνάρτηση fflush()

3 A. Ροές 1. Γενικά Η είσοδος και η έξοδος στην C, γίνεται µέσω ροών (streams). Μία ροή είναι µια ακολουθία χαρακτήρων η οποία είναι εν αναµονή για να την χρησιµοποιήσουµε ανάλογα µε την θέλησή µας. Ήδη (χωρίς να το γνωρίζουµε) έχουµε χρησιµοποιήσει δύο ροές: Την προκαθορισµένη ροή εισόδου (stdin) από την οποία διαβάζουµε χαρακτήρες από το πληκτρολόγιο. Την προκαθορισµένη ροή εξόδου (stdout) στην οποία γράφουµε χαρακτήρες στην οθόνη. stdout stdin

4 A. Ροές 1. Γενικά Κάθε ροή της C λοιπόν είναι µια ακολουθία χαρακτήρων την οποία µπορούµε να διαχειριστούµε από το πρόγραµµά µας. Πέρα από τις 2 σηµαντικές ροές που έχουµε δουλέψει έχουν οριστεί πολλές ακόµη ροές που µπορούν να διαχειριστούν είσοδο/έξοδο από και πρός άλλες συσκευές, π.χ printer DVD-ROM stdout stdin HARD DISK

5 A. Ροές 2. Η ροή προκαθορισµένης εισόδου stdin H ANSI C (διεθνές πρότυπο µε τις βασικές λειτουργίες που πρέπει να έχει κάθε µεταγλωττιστής της C) ορίζει ότι οι παρακάτω 5 ροές υπάρχουν σε κάθε υλοποίηση της C: Όνοµα Ροή Συσκευή stdin Προκαθορισµένη Είσοδος Πληκτρολόγιο stdout Προκαθορισµένη Έξοδος Οθόνη stderr Προκαθορισµένο Λάθος Οθόνη stdprn* Προκαθορισµένος Εκτυπωτής Εκτυπωτής (LPT1) stdaux* Προκαθορισµένο Βοήθηµα Σειριακή Θύρα (COM1) Οι ροές µε * χρησιµοποιούνταν σε παλιότερες εκδόσεις του DOS και θεωρούνται πλέον παρωχηµένες.

6 A. Ροές 2. Η ροή προκαθορισµένης εισόδου stdin Καλό είναι να σκεφτόµαστε την stdin σαν µια «σωλήνα» η οποία συνδέει το πληκτρολόγιο µε το πρόγραµµά µας stdin 11223 xyzw 223 Π.χ. Η συνάρτηση scanf που µάθαµε, διαβάζει τόσους χαρακτήρες από την stdin, όσοι καθορίζονται από τον προσδιοριστηπου έχουµε θέσει σαν 1o όρισµα. Αν ο χρήστης έχει εισάγει περισσότερους χαρακτήρες τότε αυτοί παραµένουν στην stdin για επόµενο διάβασµα από κάποια εντολή διαχείρισης της προκαθορισµένης εισόδου. Θα δούµε και άλλες συναρτήσεις που διαχειρίζονται την προκαθορισµένη είσοδο.

7 A. Ροές 3. Η ροή προκαθορισµένης εισόδου stdout Αντίστοιχα η stdout είναι µία «σωλήνα» που συνδέει το πρόγραµµα µας µε την οθόνη του υπολογιστή. stdout Π.χ. Η συνάρτηση puts, τοποθετεί στην stdout την συµβολοσειρά που δέχεται ως όρισµα και δίνει εντολή να τυπωθούν οι χαρακτήρες που βρίσκονται στην stdout στην οθόνη.

8 A. Ροές 4. Η ροή προκαθορισµένης εξόδου λαθών stderr. Η stderr είναι µια αυτόνοµη ροή που λειτουργεί όπως η stdout, στην οποία γράφουµε µηνύµατα λάθους εκτέλεσης του προγράµµατός µας. stderr Σε µεγάλα προγράµµατα είναι συχνό να σταµατάνε να λειτουργούν για λόγους που δεν είναι απαραίτητα προγραµµατιστικά λάθη (π.χ. Αδυναµία δέσµευσης µνήµης, αποτυχία υλικού, ασύγχρονης επικοινωνίας κ.λπ.) Προκειµένου να µην µπερδευτούν τα µηνύµατα που θέλουµε να προβάλλουµε στην οθόνη, µε τα σηµαντικά µηνύµατα αστοχίας του προγράµµατος, η C ορίζει αυτήν την βοηθητική ροή, για να γίνει διαχωρισµός της εξόδου προγράµµατος, από τα µηνύµατα λάθους.

9 1. Σύνοψη H C µας παρέχει µία σειρά από συναρτήσεις για να διαχειριστούµε την είσοδο από το πληκτρολόγιο. ύο είναι τα βασικά χαρακτηριστικά των συναρτήσεων που πρέπει να έχουµε υπόψη µας: Αν οι χαρακτήρες που πληκτρολογούµε µένουν σε έναν προσωρινό χώρο αποθήκευσης και πηγαίνουν στην stdin πατώντας Enter, ή αν κάθε χαρακτήρας που πληκτρολογούµε πηγαίνει κατευθείαν στην stdin. Το χαρακτηριστικό αυτό θα το ονοµάσουµε ενδιάµεση αποθήκευση χαρακτήρων Αν ότι πληκτρολογούµε προβάλλεται ταυτόχρονα και στην οθόνη ή όχι. Το χαρακτηριστικό αυτό θα το ονοµάσουµε προβολή χαρακτήρων

10 1. Σύνοψη Ας ρίξουµε µια πρώτη µατιά στις συναρτήσεις που θα µελετήσουµε στις επόµενες διαφάνειες: Όνοµα Λειτουργία getchar ιάβασµαενός χαρακτήρα εισόδου getch ιάβασµαενός χαρακτήρα εισόδου getche ιάβασµα ενόςχαρακτήρα εισόδου ungetc Αναίρεση λήψης χαρακτήρα Ενδιάµεση Αποθήκευση Χαρακτήρων Προβολή Χαρακτήρων Βιβλιοθήκη NAI NAI stdio.h ΟΧΙ ΟΧΙ conio.h ΟΧΙ Ν ΑΙ conio.h - - stdio.h gets ιάβασµα Συµβολοσειράς ΝΑΙ ΝΑΙ stdio.h fgets ιάβασµα Συµβολοσειράς ΝΑΙ ΝΑΙ stdio.h scanf ιάβασµα Συµβολοσειράς NAI NAI stdio.h

11 2. Η συνάρτηση getchar() Το πρωτότυπο της συνάρτησης getchar είναι: int getchar() Και έχει οριστεί στη βιβλιοθήκη: stdio.h Η συνάρτηση διαβάζει έναν χαρακτήρα από την stdin και επιστρέφει τον ASCII κωδικό της. Λειτουργεί µε ενδιάµεση αποθήκευση χαρακτήρων, άρα αναµένει από εµάς να πληκτρολογήσουµε Enter για να καταχωρηθούν οι χαρακτήρες στην stdin. Προβάλλει τους χαρακτήρες που πληκτρολογούµε στην οθόνη.

12 2. Η συνάρτηση getchar() Το παρακάτω παράδειγµα αναδεικνύει την συνάρτηση getchar /* getchar.c: Epideiksi tis entolis getchar */ #include <stdio.h> main() { char c; } c=getchar(); while(c!='x') { printf("%c,",c); c=getchar(); } printf("%c.",c); Ο χρήστης εισάγει µία συµβολοσειρά και στην συνέχεια πατάει Enter. Η είσοδος αποθηκεύεται στην stdin και περνάει στο πρόγραµµα µόλις ο χρήστης πατήσει Enter.

13 3. Η συνάρτηση getch () Το πρωτότυπο της συνάρτησης getch είναι: int getch () Και έχει οριστεί στη βιβλιοθήκη: conio.h Η συνάρτηση διαβάζει έναν χαρακτήρα από την stdin και επιστρέφει τον ASCII κωδικό της. Λειτουργεί χωρίς ενδιάµεση αποθήκευση χαρακτήρων, άρα µε το που πατάµε έναν χαρακτήρα αυτός αποθηκεύεται στην stdin. εν προβάλλει τους χαρακτήρες που πληκτρολογούµε στην οθόνη!! Προσοχή! Το αρχείο κεφαλίδας conio.hδεν είναι µέρος της ANSI C, άρα δεν είναι απαραίτητο να υπάρχει σε οποιονδήποτε µεταγλωττιστή. Ωστόσο το DEV-C++ την ενσωµατώνει, άρα µπορούµε να την χρησιµοποιήσουµε κανονικά!

14 3. Η συνάρτηση getch () Το παρακάτω παράδειγµα αναδεικνύει την συνάρτηση getch /* getch.c: Epideiksi tis entolis getch */ #include <stdio.h> #include <conio.h> main() { char c; } c=getch(); while(c!='x') { printf("%c,",c); c=getch(); } printf("%c.",c); Ο χρήστης πληκτρολογεί µία συµβολοσειρά. Η είσοδος ΕΝ αποθηκεύεται στην stdin και η πληκτρολόγηση κάθε χαρακτήρα διαβάζεται αµέσως από την getch()

15 4. Η συνάρτηση getche () Το πρωτότυπο της συνάρτησης getche είναι: int getche () Και έχει οριστεί στη βιβλιοθήκη: conio.h Η συνάρτηση λειτουργεί µε τον ίδιο τρόπο µε την getch() µε την διαφορά ότι προβάλλει τον χαρακτήρα που πληκτρολογούµε στην οθόνη. Μεταγλωττίστε και εκτελέστε το πρόγραµµα getche.c που δείχνει την λειτουργία της και την διαφορά από την εντολή getch.

16 4. Η συνάρτηση getche () Το παρακάτω παράδειγµα αναδεικνύει την συνάρτηση getche /* getche.c: Epideiksi tis entolis getch */ #include <stdio.h> #include <conio.h> main() { char c; } c=getche(); while(c!='x') { printf("%c,",c); c=getche(); } printf("%c.",c); Ο χρήστης πληκτρολογεί µία συµβολοσειρά. Η είσοδος ΕΝ αποθηκεύεται στην stdin και η πληκτρολόγηση κάθε χαρακτήρα διαβάζεται αµέσως από την getche(). Όταν πληκτρολογούµε τον χαρακτήρα προβάλλεται στην οθόνη.

17 5. Η συνάρτηση ungetc() Το πρωτότυπο της συνάρτησης ungetc είναι : int ungetc(int ch, FILE *fp) Και έχει οριστεί στη βιβλιοθήκη: stdio.h Η συνάρτηση ungetc αναιρεί την λήψη του χαρακτήρα ch από την ροή fp Θα δούµε σε επόµενο µάθηµα, ότι µπορούµε να καθορίσουµε και ροές εισόδου από αρχεία και γι αυτό ως 2 ο όρισµα µπορούµε να ορίσουµε και ροή αρχείου. Για να αναιρέσουµε λήψη από την stdin, απλά γράφουµε ως δεύτερο όρισµα τη ροή stdin. Η συνάρτηση πρακτικά επανατοποθετεί στην ροή stdin τον χαρακτήρα ch που διάβασε. Στο παράδειγµα της επόµενης διαφάνειας βλέπουµε πως χρησιµοποιούµε την ungetc.

18 5. Η συνάρτηση ungetc() Το παρακάτω παράδειγµα αναδεικνύει την συνάρτηση ungetc /* ungetc.c: Epideiksi tis entolis ungetc */ #include <stdio.h> main() { char c; c=getchar(); while(c!='\n') { printf("%c",c); c=getchar(); if (c=='m') { printf("%c",c); ungetc('!',stdin); } } } Πληκτρολογήστε µια συµβολοσειρά που περιέχει τουλάχιστον µία φορά το γράµµα m και δείτε τι επίδραση έχει στην stdin, λόγω του ότι επανατοποθετούµε έναν έξτρα χαρακτήρα στην stdin.

19 6. Η συνάρτηση gets() Το πρωτότυπο της συνάρτησης gets είναι : char *gets(char *str) Και έχει οριστεί στη βιβλιοθήκη: stdio.h Έχουµε ήδη µελετήσει την συγκεκριµένη συνάρτηση σε προηγούµενο µάθηµα. Η συνάρτηση διαβάζει µία συµβολοσειρά από την stdin µέχρι τον χαρακτήρα \n τον οποίο αντικαθιστά µε το \0 και την αποθηκεύει στην συµβολοσειρά str που δέχεται ως όρισµα µέσω αναφοράς. Αν για κάποιο λόγο αποτύχει, επιστρέφεται η τιµή NULL (κενός δείκτης), αλλιώς επιστρέφεται δείκτης στην str. Ο συνηθισµένος τρόπος χρήσης της gets είναι: gets(buffer); Όπου buffer είναι συµβολοσειρά (πίνακας χαρακτήρων) που έχουµε δεσµεύσει είτε στατικά είτε δυναµικά.

20 7. Η συνάρτηση fgets() Πολλές φορές έχουµε πρόβληµα µε την gets, διότι η συµβολοσειρά που χρησιµοποιούµε δεν έχει αρκετό χώρο για να αποθηκεύσει όλα τα δεδοµένα που εισάγει ο χρήστης. H fgets έρχεται να λύσει αυτό το πρόβληµα. Το πρωτότυπο της συνάρτησης fgets είναι: char *fgets(char *str, int n, FILE *fp) Και έχει οριστεί στο αρχείο βιβλιοθήκης: stdio.h Η συνάρτηση διαβάζει µία συµβολοσειρά από την ροή fp και την αποθηκεύει στην str µέχρι: Είτε διαβάζει τον χαρακτήρα \n τον οποίο αντικαθιστά µε \0 Είτε διαβάσει n-1 χαρακτήρες. Τότε προσθέτει τον χαρακτήρα \0 στο τέλος και τερµατίζει. Με απλά λόγια η fgets βάζει όριο στους χαρακτήρες που θα διαβάσει προκειµένου να χωράνε στην συµβολοσειρά που διοχετεύουµε ως όρισµα. Το παράδειγµα της επόµενης διαφάνειας αναδεικνύει την χρήση των παραπάνω

21 7. Η συνάρτηση fgets() Το παρακάτω παράδειγµα αναδεικνύει την συνάρτηση fgets /* fgets.c: Epideiksi tis entolis fgets */ #include <stdio.h> #define N 10 main() { char buffer[n]; } while(1) { fgets(buffer,n,stdin); printf("eisodos: %s\n",buffer); } Πληκτρολογήστε µια συµβολοσειράµε µήκος µεγαλύτερο του 10 και πατήστε Enter. Παρατηρείστε την συµπεριφορά του προγράµµατος.

22 8. Η συνάρτηση scanf() Την συνάρτηση scanf την έχουµε µελετήσει ήδη δύο φορές. Λόγω του πλούτου που έχει η χρήση της, σήµερα θα δούµε και τις τελευταίες εξειδικευµένες χρήσεις Ένα τυπικό παράδειγµα χρήσης της scanf που έχει οριστεί στο scanf("%x",&µεταβλητή); stdio.h είναι το εξής: Όπου το 1 ο όρισµα είναι η συµβολοσειρά µορφοποίησης και στα επόµενα ορίσµατα ορίζουµε τις (διευθύνσεις) των µεταβλητών που θα δεχθούν τις τιµές που θα εισάγει ο χρήστης Σηµαντικά θέµατα είναι τα εξής: Τι µπορούµε να έχουµε στην συµβολοσειρά µορφοποίησης Ποιοι είναι οι προσδιοριστές που µπορούµε να έχουµε στη συµβολοσειρά µορφοποίησης Επίσης θα πρέπει να ξέρουµε ότι: Γίνεται προβολή των χαρακτήρων στην οθόνη όσο πληκτρολογούµε. Ενώ γίνεται και ενδιάµεση αποθήκευση των χαρακτήρων

23 8. Η συνάρτηση scanf() Στο µάθηµα 9: «Εισαγωγή στην Είσοδο/Έξοδο εδοµένων» είδαµε τους προσδιοριστές της scanf. Έχουν ωστόσο οριστεί περαιτέρω δύο ειδικές χρήσεις προσδιοριστών ώστε να καθορίζουµε ρητά τους χαρακτήρες που µπορούν να διαβαστούν (ισοδύναµα να απαγορευτεί το διάβασµα κάποιων χαρακτήρων). Αυτοί είναι: Προσδιοριστής Τύπος δεδοµένων που αντιστοιχεί [...] Συµβολοσειραπου µόνο οι χαρακτήρες στα [ ] είναι αποδεκτοί. Μόλις διαβάσει χαρακτήρες εκτός των [ ] σταµατά την ανάγνωση. [^...] Το ίδιοµε την [ ], αλλά µόνο οι χαρακτήρες εκτός των [ ] είναι αποδεικτοί

24 8. Η συνάρτηση scanf() Το παρακάτω πρόγραµµα αναδεικνύει την χρήση των επιπλέον προσδιοριστών που εισάγαµε: /* scanf.c: Epideiksi tis entolis scanf */ #include <stdio.h> main() { char buffer[80]; } printf("eisagete simvoloseira: "); scanf("%[abcdef]",buffer); printf("diavastike: %s\n",buffer); printf("eisagete simvoloseira: "); scanf("%[^abcdef]",buffer); printf("diavastike: %s",buffer); Πληκτρολογήστε και εκτελέστε το πρόγραµµα εισάγοντας µια φράση που περιέχει τους χαρακτήρες που παρατίθενται στον προσδιοριστή.

25 9. Η συνάρτηση fflush() Όταν εκτελείται µία κλήση στην scanf λαµβάνεται τόση είσοδος από την stdin όση είναι απαραίτητη για να διαβαστεί ο τύπος των δεδοµένων που ορίσαµε. Έτσι για παράδειγµα αν έχουµε την εντολή: scanf("%d",&x); scanf("%d",&y); stdio.h Και ο χρήστης εισάγει: 15 20 30 Τότε διαβάζεται το 15 και ανατίθεται στη x, αγνοείται το κενό και διαβάζεται το 20 και ανατίθεται στην y.οι υπόλοιποι χαρακτήρες παραµένουν στην stdin για επόµενο διάβασµα. Συνεπώς επειδή αναµένουµε πάντα κακή συµπεριφορά του χρήστη απέναντι στο πρόγραµµα πρέπει πάντα να περιµένουµε ότι ενδέχεται να έχουν αποµείνει κάποιοι χαρακτήρες στην stdin µετά από κάποιο διάβασµα. Ειδικά ο χαρακτήρας \n αποµένει στην είσοδο µετά από διάβασµα µε την scanf. Για τον λόγο αυτό χρειαζόµαστε την συνάρτηση fflush.

26 9. Η συνάρτηση fflush() Το πρωτότυπο της συνάρτησης fflush είναι: int fflush(file *fp) Και έχει οριστεί στο αρχείο βιβλιοθήκης: stdio.h Η συνάρτηση «αδειάζει» την stdin από τυχόν χαρακτήρες που έχουν αποµείνει σε αυτήν. Μεταγλωττίστε το παράδειγµα της επόµενης διαφάνειας (το οποίο δεν δουλεύει σωστά) µε χρήση της fflush

27 9. Η συνάρτηση fflush() /* fflush_wrong.c: Epideiksi tis entolis fflush */ #include <stdio.h> main() { int x,y,z; char c; printf("dwse enan tripsifio arithmo:"); scanf("%1d%1d%1d", &x,&y,&z); printf("epelekse M-Monades,D-Dekades,E-Ekatontades: "); scanf("%c",&c);

28 9. Η συνάρτηση fflush() } switch(c) { case 'M': printf("monades=%d",z); break; case 'D': printf("dekades=%d",y); break; case 'E': printf("ekatontades=%d",z); break; default: printf("lathos eisodos!"); }

29 Β. Ασκήσεις 1. Μετατροπή σε κεφαλαία (ξανά) Γράψτε ένα πρόγραµµα το οποίο θέλουµε να: 1. ιαβάζει µία συµβολοσειρά από το πληκτρολόγιο ( ΕΝ θέλουµε να αποθηκεύεται σε κάποιον πίνακα και ΕΝ θέλουµε να εµφανίζεται αυτό που πληκτρολογεί ο χρήστης) 2. Εµφανίζει στην οθόνη την ίδια συµβολοσειρά όπου κάθε µικρός χαρακτήρας έχει αντικατασταθεί από τον αντίστοιχο κεφαλαίο χαρακτήρα.

30 Β. Ασκήσεις 2. ιάβασµα συµβολοσειρών Γράψτε ένα πρόγραµµα το οποίο: 1. ηλώνει έναν πίνακα χαρακτήρων (µε ονοµασία string) µεγέθους 10. 2. Ζητά από τον χρήστη να πληκτρολογήσει µία συµβολοσειρά. 3. Εάν η συµβολοσειρά χωράει στο string να την αποθηκεύει σε αυτό και να προβάλλει ότι «η συµβολοσειρά διαβάστηκε» και να την τυπώνει. 4. Εάν η συµβολοσειρά δεν χωράει στο string να αποθηκεύει το µέρος που µπορεί να αποθηκευτεί και να προβάλλει «η συµβολοσειρά δεν διαβάστηκε» και να τυπώνει το µέρος που «χώρεσε» στο string. Να καθαρίζει την stdin από τους χαρακτήρες που έχουν αποµείνει.