Λοιπον.... τελικα αυτο που ειχα πει οτι οταν o '\n' φεύγει σαν είσοδος απο μια scanf σε 2η (επειδη συμφωνα με την λειτουργια της ποτε δεν διαβαζει τον τελευταιο χαρακτηρα αλλαγης γραμμης αλλα τον θέτει put back που λεει και μεσα για επομενη κληση της) και οτι λαμβάνεται σαν space / blank character στην 2η ειναι μεν σωστο αλλα δεν γινεται skip. Εκτος και αν μεσα στο format string ο προγραμματιστης έχει προνοησει να έχει βάλει έναν ordinary character μαζι με το conversion specification %c. Σε αυτη τη περίπτωση η scanf θα ταιριάξει το ένα αυτο κενό με οσα κενα πληκτρολογησει ο χρήστης οπως λεει και σελιδα 45 και θα αντιστοιχισει μετα τον χαρακτήρα που θα δωσει στο %c πλεον. (Θα κανει δηλαδη το απαραιτητο locate) .
ΕΠισης τα κενά τα κανει skip εγγυημενα ενω ψαχνει για ακέραιους. Παρακατω παραθέτω ενα παράδειγμα :
- Κώδικας: Επιλογή όλων
#include<stdio.h>
int main(void)
{
char c1 , c2 , c3 ,c4 , c5 , c6;
//int i;
//char c7=' ';
printf(" Give a character: ");
scanf(" %c" , &c1);
printf(" Give a character : ");
scanf(" %c" , &c2 );
printf(" Give a character: ");
scanf("%c" , &c3);
printf(" Give a character: ");
scanf("%c" , &c4);
printf(" Give a character: ");
scanf("%c", &c5);
printf(" Give a character: ");
scanf("%c" , &c6);
printf(" Character is: %c" , c1);
printf(" Character is : %c" , c2);
printf(" Character is: %c " , c3);
printf(" Character is: %c " , c4);
printf(" Character is: %c " , c5);
printf(" Character is: %c " , c6);
return 0;
}
Στο παραπάνω παράδειγμα θα "δουλεψουν" μονο τα c1 , c2 , c4 , c6 υπο την έννοια οτι μονο αυτα θα δειξουν κάποιον χαρακτήρα που θα δώσει ο χρήστης και τα αλλα δουλευουν απλα δειχνουν κενο. Ο κωδικας δουλεύει ως εξης....
Δινεις αρχικα εναν χαρακτηρα και τον \n μιας και πατάς επομενη γραμμη στον φλοιό ηο '\n' δεν διαβαζεται καν απο την 1η και παει απευθειας σαν εισοδος στην 2η οπου κανει την αντιστοιχιση μιας και έχουμε αφησει ηδη ενα κενο μεσα στο format string και περιμενει εναν ακομη χαρακτηρα... τον δινεις και πατας αλλαγη γραμμης.... στην 3η scanf παιρνει απλα το '\n' και παει στην 4η "καθαρος" πλεον ο φλοιος χωρις ας πουμε κατι... στο 4 πληκτρολογεις εναν χαρακτηρα και επειδη παλι λογω της ιδιας δουλειας... στην 5η scanf διαβάζεται ο κενος ενω στην 6 πληκτρολογεις παλι εναν δικο σου χαρακτηρα... για αυτο το λογο οι c1,c2,c4,c6 θα δουλεψουν σε εισαγωγικα μεσα στην printf και οχι οι c3 , c5 με την εννοια οτι δινουν κενο.
ΣΥμφωνα επισης με την θεωρια.... δεν ειναι υποχρεωτικο αν εγω βαλω εναν ordinary κενο μεσα στο format string της scanf να πρεπει και στα δεδομενα εισοδου να εχω κανει το ιδιο.....
ισως επιστρεψω και με ενα παραδειγμα ακομη που στην 2η scanf δεχεται και ακεραιο μαζι με χαρακτηρα αλλα εκει χανεται η μπαλα και γινεται πιο περιπλοκο. ΕΙδωμεν...
ελπιζω να μην τα εχω καταλαβει λαθος

To οτι δεν ειναι θεμα της γλώσσας τα προβληματα της scanf μαλλον το θεωρουν οτι οφειλεται σε προγραμματιστικη κακομεταχειριση και οχι τοσο στην "προβληματικοτητα" της συναρτησης.
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]