Συνοπτικός οδηγός αναφοράς συναρτήσεων της C
  Επιμέλεια περιεχομένου: Βίκυ Πάρρυ

Πρότυπη επικεφαλίδα: stdio.h
Σύνταξη: int printf ( const char *format, <op1>, <op2>, ...)
Λειτουργία:

Γράφει στο stdout τα ορίσματα <op1>, <op2>, ..., σύμφωνα με την οδηγία της συμβολοσειράς format, και επιστρέφει το πλήθος των χαρακτήρων που γράφτηκαν, ή αρνητική τιμή σε περίπτωση λάθους.

  • Η συμβολοσειρά format περιλαμβάνει χαρακτήρες που μεταφέρονται αυτούσιοι στην έξοδο και προδιαγραφές μετατροπής για την εκτύπωση των ορισμάτων <op1>, <op2> ...
  • Σε περίπτωση που θέλουμε η συμβολοσειρά που θα μεταφερθεί στην έξοδο να περιέχει τον χαρακτήρα ", τότε πρέπει να τον γράψουμε \", αλλιώς κλείνουμε την συμβολοσειρά format.
  • Μία προδιαγραφή μετατροπής αρχίζει με τον χαρακτήρα % και τερματίζει με ένα χαρακτήρα που δείχνει το είδος της μετατροπής που πρέπει να γίνει. Η γενική μορφή μιας προδιαγραφής μετατροπής είναι η εξής:

%[τρ][εππ][.ακρ][μμ]χμ

  • ό,τι βρίσκεται μέσα σε [ και ], δεν είναι υποχρεωτικό να υπάρχει.

Μεταξύ του % και του χαρακτήρα μετατροπής (χμ) μπορεί να υπάρχουν:

  • Κάποιοι τροποποιητές (τρ) με οποιαδήποτε σειρά:
    • ένα -, που επιβάλλει αριστερή στοίχιση
    • ένα +, που καθορίζει ότι ο αριθμός θα εμφανίζεται πάντα με πρόσημο
    • ένα 0, που, για αριθμούς, επιβάλλει τη συμπλήρωση του πλάτους πεδίου με μηδενικά στην αρχή, εφ 'όσον έχουμε δεξιά στοίχιση, δηλδαή αν δεν έχει δοθεί και το - σαν τροποποιητής.
  • Το ελάχιστο πλάτος πεδίου (εππ), δηλαδή ένας αριθμός που δείχνει τον ελάχιστο αριθμό χαρακτήρων που θα εκτυπωθούν. Εάν η τιμή που θα εκυτυπωθεί έχει λιγότερα ψηφία από το εππ, συμπληρώνονται κενά αριστερά ή δεξιά, ανάλογα με τη στοίχιση, ή μηδενικά στην αρχή αν έχουμε δεξιά στοίχιση και έχει δοθεί και η ένδειξη 0 ότι θέλουμε συμπλήρωση με μηδενικά.
  • Μία τελεία . και ένας αριθμός, η ακρίβεια (ακρ), που καθορίζει το μέγιστο αριθμό χαρακτήρων που θα εκτυπωθούν για ένα αλφαριθμητικό, τον αριθμό των ψηφίων (δεκαδικών για μετατροπές f, e ή E ή σημαντικών για μετατροπές g ή G) για αριθμό κινητής υποδιαστολής, ή τον ελάχιστο αριθμό ψηφίων για ακέραιο.
  • Το μέγεθος μεταβλητής (μμ), δηλδαή h, l, ή L, αν πρόκειται για short int, long int ή long double, αντίστοιχα.

Πιθανοί χαρακτήρες μετατροπής είναι:

  • d: Για ακέραιους αριθμούς στο δεκαδικό σύστημα.
  • o: Για απροσήμαστους οκταδικούς αριθμούς.
  • x, X: Για απροσήμαστους δεκαεξαδικούς αριθμούς. Με μετατροπή x, τα "ψηφία" μετά το 9 εμφανίζονται πεζά (a, b, c, d, e, f), ενώ με μετατροπή X, εμφανίζονται κεφαλαία (A, B, C, D, E, F).
  • u: Για απροσήμαστους αριθμούς στο δεκαδικό σύστημα.
  • c: Για χαρακτήρες.
  • s: Για συμβολοσειρές.
  • f: Για αριθμούς κινητής υποδιαστολής, σε αναπαράσταση χωρίς εκθέτη.
  • e, E: Για αριθμούς κινητής υποδιαστολής, σε αναπαράσταση με εκθέτη. Το σύμβολο της ύψωσης σε δύναμη του 10 εμφανίζεται σαν e ή E, ανάλογα με τον χαρακτήρα μετατροπής που χρσιμοποιήθηκε.
  • g, G: Για αριθμούς κινητής υποδιαστολής, σε αναπαράσταση με ή χωρίς εκθέτη, ανάλογα με το μέγεθος του εκθέτη σε σχέση με την ακρίβεια που έχει ζητηθεί. Αν ο εκθέτης είναι μικρότερος του -4 ή μεγαλύτερος από ή ίσος με την ακρίβεια, εφαρμόζεται μετατροπή e ή E (ανάλογα με το αν έχουμε g ή G), αλλιώς εφαρμόζεται μετατροπή f. Τα μηδενικά και η υποδιαστολή στο τέλος δεν εμφανίζονται.
  • %: Για εκτύπωση του % στο stdout.

 

Παράδειγμα:
C:\Proteas>printf.exe
Testing the printf function.
"|" marks where the printing begins and ends.

Testing integer number 3456.
%d is:          |3456|
%7d is:         |   3456|
%2d is:         |3456|
%-7d is:        |3456   |
%+7d is:        |  +3456|
%07d is:        |0003456|
%7.5d is:       |  03456|
%7o is:         |   6600|
%-7x is:        |d80    |
%7.6X is:       | 000D80|

Testing double number -3768.08549.
%f is:          |-3768.085490|
%14.4f is:      |    -3768.0855|
%-14.3f is:     |-3768.085     |
%e is:          |-3.768085e+003|
%14/4E is:      |  -3.7681E+003|
%-14.3e is:     |-3.768e+003   |
%g is:          |-3768.09|
%14.4g is:      |         -3768|
%-14.3G is:     |-3.77E+003    |
% 014.4f is:    |-00003768.0855|

Testing string "this is a test phrase".
%s is:          |this is a test phrase|
%25s is:        |    this is a test phrase|
%12s is:        |this is a test phrase|
%.12s is:       |this is a te|
%-25s is:       |this is a test phrase    |
%25.12s is:     |             this is a te|
%-25.12s is:    |this is a te             |

Πρότυπη επικεφαλίδα: stdio.h
Σύνταξη: int scanf(const char *format, <op1>, <op2>, ...)
Λειτουργία:

Διαβάζει από το stdin δεδομένα, σύμφωνα με την συμβολοσειρά format, και τα αποθηκεύει εκεί που δείχνουν οι δείκτες <op1>, <op2> .... Επιστρέφει το πλήθος των αντικειμένων που διαβάστηκαν ή EOF, αν έχει διαβαστεί όλη η είσοδος.

  • Οι δείκτες <op1>, <op2> .... πρέπει να δείχνουν ήδη σε δεσμευμένα αντικείμενα των τύπων που ορίζονται στις αντίστοιχες προδιαγραφές μετατροπής στην συμβολοσειρά format.
  • Ένα δεδομένο εισόδου είναι μία ακολουθία από μη λευκούς χαρακτήρες που τερματίζει στον επόμενο λευκό χαρακτήρα (κενό, στηλογνώμονας ή αλλαγή γραμμής), ή στον επόμενο χαρακτήρα που αναμένεται να διαβαστεί με βάση το format, ή όταν εξαντληθεί το πλάτος του πεδίου. Η scanf θα διαβάζει πέρα από τα όρια της γραμμής για να βρει την είσοδο της, αφού θα αγνοήσει τυχόν λευκά διαστήματα μέχρι να βρει τον πρώτο μη λευκό χαρακτήρα.
  • Σε περίπτωση δύο συνεχόμενων scanf, εάν η πρώτη δεν έχει διαβάσει όλα τα δεδομένα εισόδου, η δεύτερη θα συνεχίσει το διάβασμα από εκεί που έμεινε η πρώτη, πράγμα που μπορεί να μην είναι επιθυμητό, οπότε χρειάζεται προσοχή εδώ.

Η συμβολοσειρά format μπορεί να περιλαμβάνει:

  • Κενά ή στηλογνώμονες, που επιβάλλουν την κατανάλωση όλων των λευκών χαρακτήρων από την τρέχουσα θέση της εισόδου και μετά.
  • Άλλους χαρακτήρες, εκτός από τον %, που πρέπει να συμφωνούν με τον επόμενο μη λευκό χαρακτήρα στην είσοδο, αλλιώς η scanf σταματά το διάβασμα. Εάν συμφωνούν, η scanf τους αγνοεί και συνεχίζει το διάβασμα.
  • Προδιαγραφές μετατροπής, που έχουν την γενική μορφή:

%[*][μππ][μμ]χμ

    ό,τι βρίσκεται μέσα σε [ και ], δεν είναι υποχρεωτικό να υπάρχει.

Μεταξύ του % και του χαρακτήρα μετατροπής (χμ) μπορεί να υπάρχουν:

  • ο χαρακτήρας *, που δείχνει ότι το δεδομένο που διαβάστηκε δεν πρέπει να φυλαχθεί.
  • έναν αριθμό που καθορίζει το μέγιστο πλάτος πεδίου, δηλαδή τον μέγιστο αριθμό χαρακτήρων που πρέπει να διαβαστούν από την είσοδο.
  • το μέγεθος μεταβλητής, δηλαδή ένα h, για την ανάγνωση short int, ή ένα l, για long int ή double, ή ένα L για long double.
  • ένα χαρακτήρα μετατροπής, αντίστοιχα με αυτούς της printf (d, o, x, u, c, s, f, e, g, %) ή [...], το οποίο προκαλεί την ανάγνωση της μεγαλύτερης ακολουθίας χαρακτήρων στην είσοδο, από αυτούς που περιλαμβάνονται μέσα στα [ και ], ή [^...], το οποίο είναι παρόμοιο με το προηγούμενο, αλλά διαβάζονται χαρακτήρες που ΔΕΝ περιέχονται μέσα στα [ και ].

Επισημαίνεται ότι η χρήση της scanf για ανάγνωση συμβολοσειρών παρουσιάζει παρόμοιο πρόβλημα ασφάλειας με αυτό της συνάρτησης gets, το οποίο όμως αντιμετωπίζεται αν δηλωθεί και μέγιστο πλάτος πεδίου (π.χ. %20s) για την ανάγνωση.

 

Παράδειγμα:

Κώδικας προγράμματος

#include <stdio.h>
main()
{
char str [80];
int i;

printf ("Enter your name: ");
scanf ("%6s", str);
printf ("Enter your age: ");
scanf ("%d",&i);
printf ("Your name is %s , you are %d years old.\n", str, i);
printf ("Enter a hexadecimal number: ");
scanf ("%x",&i);
printf ("You have entered %#x, which is %d in decimal.\n", i, i);
printf ("Enter a string\n");
scanf ("%[^abcd]", str);
printf ("String that did not contain a b c or d is: %s\n", str);


}

Αποτέλεσμα προγράμματος

C:\Proteas>scanf.exe
Enter your name: George
Enter your age: 20
Your name is George , you are 20 years old.
Enter a hexadecimal number: F4
You have entered 0xf4, which is 244 in decimal.
Enter a string
multiadding
String that did not contain a b c or d is:
multi

Πρότυπη επικεφαλίδα: math.h
Σύνταξη: double sqrt ( double x )
Λειτουργία:

Επιστρέφει την τετραγωνική ρίζα του x. To x πρέπει να είναι θετικός αριθμός.

  • Σε περίπτωση που το x είναι αρνητικός αριθμός, θέτει την μεταβλητή errno σε EDOM. Η μεταβλητή errno είναι ορισμένη στην επικεφαλίδα errno.h

 

Παράδειγμα:

Kώδικας προγράμματος

#include <stdio.h>
#include <math.h>

main()
{
double mynumber=625.0, result;

result = sqrt (mynumber);
printf ("The square root of %lf is: %lf\n", mynumber, result );


}

Αποτέλεσμα προγράμματος

C:\Proteas>sqrt.exe
The square root of 625.000000 is: 25.000000

Πρότυπη επικεφαλίδα: stdio.h
Σύνταξη: int getchar ( void )
Λειτουργία:

Επιστρέφει τον επόμενο χαρακτήρα από την πρότυπη είσοδο (stdin).

  • Εάν έχει φτάσει στο τέλος του αρχείου ή συμβεί κάποιο λάθος στην ανάγνωση, η getchar επιστρέφει EOF. Με χρήση της ferror ή της feof μπορεί να διαπιστωθεί εάν έγινε κάποιο λάθος ή εάν τελείωσε το αρχείο.
  • Η συνάρτηση getchar είναι ανάλογη με την συνάρτηση getc με το stdin ως είσοδο.

 

Παράδειγμα:

Kώδικας προγράμματος

#include <stdio.h>

main()
{
char c;
int i;

for (i=0; i<10; i++)
   { c=getchar();
     printf("Getting new character from input: %c\n", c);
   }


}

Αποτέλεσμα προγράμματος

C:\Proteas>getchar.exe
thisisanexample
Getting new character from input: t
Getting new character from input: h
Getting new character from input: i
Getting new character from input: s
Getting new character from input: i
Getting new character from input: s
Getting new character from input: a
Getting new character from input: n
Getting new character from input: e
Getting new character from input: x

Πρότυπη επικεφαλίδα: stdio.h
Σύνταξη: int putchar ( int x )
Λειτουργία:

Γράφει τον χαρακτήρα x στην πρότυπη έξοδο (stdout).

  • Εάν συμβεί κάποιο λάθος επιστρέφει EOF, αλλιώς επιστρέφει τον χαρακτήρα που μόλις έχει γραφτεί.

 

Παράδειγμα:

Kώδικας προγράμματος

#include <stdio.h>

main()
{
char c;

do
  { c=getchar();
     putchar(c);
  } while(c!='.');


}

Αρχείο εισόδου προγράμματος

This is an example for the putchar function. It shows how putchar will print each character from the input until getchar reads a dot.

Αποτέλεσμα προγράμματος

C:\Proteas>putchar.exe < input.txt
This is an example for the putchar function.

Πρότυπη επικεφαλίδα: time.h
Σύνταξη: time_t time ( time_t * timer )
Λειτουργία:

Επιστρέφει την τρέχουσα ημερολογιακή ώρα. Αν ο δείκτης timer είναι διάφορος του NULL, η επιστρεφόμενη τιμή αποδίδεται και στο αντικείμενο στο οποίο δείχνει ο timer (*timer).

  • Εάν η ημερολογιακή ώρα δεν είναι διαθέσιμη, η time επιστρέφει -1.
  • Ο timer είναι δείκτης σε τύπο time_t, δηλαδή ένα τύπο που είναι ορισμένος στην επικεφαλίδα time.h για τη φύλαξη τιμών που αναπαριστούν χρόνο.

 

Παράδειγμα:

Kώδικας προγράμματος

#include <stdio.h>
#include <time.h>

main()
{
time_t seconds;

seconds = time (NULL);
printf ("%ld hours since January 1, 1970", seconds/3600);


}

Αποτέλεσμα προγράμματος

C:\Proteas>time.exe
339684 hours since January 1, 1970

Πρότυπη επικεφαλίδα: stdlib.h
Σύνταξη: void srand ( unsigned int seed )
Λειτουργία:

Αρχικοποιεί την γεννήτρια ψευδο-τυχαίων αριθμών με χρήση του ορίσματος seed.

  • Για κάθε διαφορετική τιμή του seed που χρησιμοποιείται στην srand, η συνάρτηση rand δημιουργεί διαφορετικές ακολουθίες αριθμών. Me δύο διαφορετικές αρχικοποιήσεις με την ίδια τιμή του seed, η rand θα δημιουργήσει την ίδια ακολουθία αριθμών και στις δύο περιπτώσεις.
  • Εάν η τιμή του seed είναι 1, η rand επαναρχικοποιείται στην αρχική της τιμή και παράγει τις ίδιες τιμές με αυτές πριν κάθε κλήση της srand.
  • Για να δημιουργηθούν περίπου-τυχαίοι αριθμοί, η srand συνήθως αρχικοποιείται με κάποια μοναδική τιμή, όπως η τιμή που επιστρέφει η συνάρτηση time, που είναι διαφορετική κάθε δευτερόλεπτο.

 

Παράδειγμα:

Kώδικας προγράμματος

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

main()
{
printf ("First number: %d\n", rand());
srand ( time(NULL) );
printf ("Random number: %d\n", rand());
printf("Another Random number: %d\n", rand());
srand ( 1 );
printf ("Again the first number: %d\n", rand());


}

Αποτέλεσμα προγράμματος

C:\Proteas>srand.exe
First number: 41
Random number: 18443
Another Random number: 10539
Again the first number: 41

Πρότυπη επικεφαλίδα: stdlib.h
Σύνταξη: int rand ( void )
Λειτουργία:

Επιστρέφει έναν ψευδό-τυχαίο ακέραιο αριθμό στο διάστημα από 0 εώς RAND_MAX.

  • H RAND_MAX είναι μία σταθερά ορισμένη στο stdlib.h. Η τιμή της μπορεί να διαφέρει μεταξύ υλοποιήσεων, αλλά είναι τουλάχιστον 32767.
  • Ο αριθμός δημιουργείται από έναν αλγόριθμο που επιστρέφει μία ακολουθία από φαινομενικά μη συσχετιζόμενους αριθμούς. Ο αλγόριθμος αυτός χρησιμοποιεί ένα φύτρο (seed) που πρέπει να αρχικοποιείται με την χρήση της srand.
  • Ένας συνηθισμένος τρόπος για να δημιουργηθούν ψευδο-τυχαίοι αριθμοί σε ένα συγκεκριμένο διάστημα ακεραίων, είναι να χρησιμοποιηθεί το υπόλοιπο της ακέραιας διαίρεσης μεταξύ της τιμής που επιστρέφει η rand και του διαστήματος που θέλουμε μείον της αρχικής τιμής του διαστήματος συν ένα, και στην συνέχεια να προσθέσουμε την αρχική τιμή του διαστήματος. Για διάστημα μεταξύ x και y, διαιρούμε με (y-x+1) και προσθέτουμε το x: [rand() % (y-x+1) + x]

    • ( τιμή % 20 ) => διάστημα από 0 μέχρι 19
    • ( τιμή % 20 + 1 ) => διάστημα από 1 μέχρι 20
    • ( τιμή % 1986 + 20 ) => διάστημα από 20 μέχρι 2005

 

Παράδειγμα:

Kώδικας προγράμματος

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

main()
{
int random_number;

srand ( time(NULL) );
printf("Generating a random number from 1 to 10\n");
random_number=rand() % 10 + 1;
printf("Number is: %d\n", random_number);
printf("Generating a random number from 101 to 1100\n");
random_number=rand() % 1000 + 101;
printf("Number is: %d\n", random_number);
printf("Generating a random number from 51 to 120\n");
random_number=rand() % 70 + 51;
printf("Number is: %d\n", random_number);


}

Αποτέλεσμα προγράμματος

C:\Proteas>rand.exe
Generating a random number from 1 to 10
Number is: 5
Generating a random number from 101 to 1100
Number is: 1067
Generating a random number from 51 to 120
Number is: 116

Πρότυπη επικεφαλίδα: stdlib.h
Σύνταξη: void * malloc ( size_t size )
Λειτουργία:

Δεσμέυει μία ομάδα από bytes στην μνήμη, και επιστρέφει έναν δείκτη στην αρχή της ομάδας.

  • Τα περιεχόμενα της ομάδας μνήμης που δεσμέυτηκε δεν αρχικοποιούνται, αλλά παραμένουν με τυχαίες τιμές.
  • Η παράμετρος size προσδιορίζει το μέγεθος της μνήμης που θα δεσμευτεί, σε αριθμό bytes.
  • Ο δείκτης που επιστρέφει η malloc είναι τύπου void*, αφού δεν την αφορά τι τύπου δεδομένα θα φυλάξουμε στην μνήμη που δεύσμευσε. Ο δείκτης αυτός μπορεί αργότερα να προσαρμοσθεί στον κατάλληλο τύπο με χρήση type casting.
  • Σε περίπτωση που η malloc αποτύχει να δεσμέυσει τον επιθυμητό χώρο στην μνήμη, επιστρέφει τον κενό δείκτη (NULL). Μετά από κάθε κλήση της malloc πρέπει να ελέγχουμε αν επέστρεψε δείκτη διάφορο του NULL.
  • Επειδή το πλήθος των bytes που χρησιμοποιούνται για τη φύλαξη δεδομένων κάθε τύπου μπορεί να διαφέρει μεταξύ διαφορετικών μεταγλωττιστών, λειτουργικών συστημάτων και επεξεργαστών, το πλήθος των bytes που ζητάμε από την malloc να δεσμεύσει τον δίνουμε μέσω του τελεστή sizeof (πχ, "malloc(10*sizeof(int))" σημαίνει ότι η malloc θα δεσμεύσει χώρο για 10 ακεραίους, ανεξάρτητα από την υλοποίηση).
  • Κάθε φορά που δεσμεύουμε δυναμικά μνήμη, πρέπει να την αποδεσμεύουμε όταν δεν την χρειαζόμαστε πια, με χρήση της συνάρτησης free.

 

Παράδειγμα:

Kώδικας προγράμματος

#include <stdio.h>
#include <stdlib.h>

main()
{
int i;
char *buffer;

printf ("Allocating memory for 12 characters...\n");
buffer = malloc (13*sizeof(char));
if (buffer==NULL) return 1;
printf("Please insert a phrase and then press enter\n");
for (i=0; i<13; i++)
  buffer[i]=getchar();
buffer[i]='\0';
printf ("Printing the first 12 characters you typed in: %s\n", buffer);
free (buffer);


}

Αποτέλεσμα προγράμματος

C:\Proteas>malloc.exe
Allocating memory for 12 characters...
Please insert a phrase and then press enter
hello world! hello everyone!
Printing the first 12 characters you typed in: hello world!

Πρότυπη επικεφαλίδα: stdlib.h
Σύνταξη: void free ( void * ptr )
Λειτουργία:

Aποδεσμεύει τον χώρο στον οποίο δείχνει ο δείκτης ptr.

  • Ο ptr πρέπει να είναι δείκτης σε χώρο που προηγουμένως έχει δεσμευτεί με χρήση των malloc, calloc ή realloc.
  • Μετά την αποδέσμευση, ο χώρος είναι ξανά διαθέσιμος για επόμενες δεσμέυσεις.
  • Εάν ο δείκτης ptr είναι NULL, η free δεν κάνει τίποτα.

 

Παράδειγμα:

Kώδικας προγράμματος

#include <stdio.h>
#include <stdlib.h>

main()
{
int * buffer1;
float * buffer2;
int ** buffer3;
int i;

buffer1 = malloc (100*sizeof(int));
buffer2 = malloc (350*sizeof(float));
buffer3 = malloc (4*sizeof(int*));
for (i=0; i<4; i++)
  buffer3[i] = malloc (4*sizeof(int));

free(buffer1);
free(buffer2);
for (i=0; i<4; i++)
  free(buffer3[i]);
free(buffer3);


}


Πρότυπη επικεφαλίδα: string.h
Σύνταξη: size_t strlen ( const char * str )
Λειτουργία:

Επιστρέφει το μήκος της συμβολοσειράς str (χωρίς το τελικό '\0').

  • Ο τύπος size_t είναι πρακτικά unsigned int.
  • Το μήκος της συμβολοσειράς δεν πρέπει να συγχέεται με το μέγεθος του πίνακα στον οποίο είναι φυλαγμένη. Πχ. το char mystring[100]="test string"; ορίζει έναν πίνακα μεγέθους 100 χαρακτήρων, αλλά η συμβολοσειρά με την οποία έχει αρχικοποιηθεί έχει μήκος μόνο 11 χαρακτήρες. Έτσι, sizeof(mystring)=100 και strlen(mystring)=11.
  • Η δήλωση const στην παράμετρο της συνάρτησης σημαίνει ότι η συμβολοσειρά δεν θα μεταβληθεί από την συνάρτηση.

 

Παράδειγμα:

Kώδικας προγράμματος

#include <stdio.h>
#include <string.h>

main()
{
char str[80];
int length;

printf ("Enter a word: ");
scanf("%s", str);
length=strlen(str);
printf ("The word is %u characters long.\n", length);


}

Αποτέλεσμα προγράμματος

C:\Proteas>strlen.exe
Enter a word: absolutely
The word is 10 characters long.

Πρότυπη επικεφαλίδα: string.h
Σύνταξη: char * strcpy ( char * str1, const char * str2 )
Λειτουργία:

Αντιγράφει την συμβολοσειρά str2, (περιλαμβάνοντας και το τελικό '\0') στην συμβολοσειρά str1, την οποία επιστρέφει στο όνομα της.

  • Η strcpy δεν αναλαμβάνει την δέσμευση της απαραίτητης μνήμης στην συμβολοσειρά str1. Είναι ευθύνη της καλούσας συνάρτησης να το κάνει αυτό.
  • Το μέγεθος της συμβολοσειράς str1 πρέπει να είναι τουλάχιστον όσο αυτό της συμβολοσειράς str2 (μαζί με τον χαρακτήρα '\0') για να γίνει σωστά η αντιγραφή.
  • Η δήλωση const σε παραμέτρους της συνάρτησης σημαίνει ότι οι αντίστοιχες συμβολοσειρές δεν θα μεταβληθούν από την συνάρτηση.

 

Παράδειγμα:

Kώδικας προγράμματος

#include <stdio.h>
#include <string.h>

main()
{
char str1[]="A string to be copied.";
char str2[40];
char str3[40];

strcpy (str2,str1);
strcpy (str3,"String has been copied.");
printf ("str1: %s\nstr2: %s\nstr3: %s\n",str1,str2,str3);


}

Αποτέλεσμα προγράμματος

C:\Proteas>strcpy.exe
str1: A string to be copied.
str2: A string to be copied.
str3: String has been copied.

Πρότυπη επικεφαλίδα: string.h
Σύνταξη: int strcmp ( const char * str1, const char * str2 )
Λειτουργία:

Συγκρίνει τις συμβολοσειρές str1 και str2, και επιστρέφει έναν ακέραιο θετικό, μηδέν, ή αρνητικό, ανάλογα αν η συμβολοσειρά str1 ακολουθεί (αλφαβητικά), ταυτίζεται ή προηγείται της συμβολοσειράς str2, αντίστοιχα.

  • Η σύγκριση γίνεται με βάση τους ASCII κωδικούς των χαρακτήρων των συμβολοσειρών.
  • Η δήλωση const σε παραμέτρους της συνάρτησης σημαίνει ότι οι αντίστοιχες συμβολοσειρές δεν θα μεταβληθούν από την συνάρτηση.
  • H συνάρτηση αρχίζει συγκρίνοντας τους πρώτους χαρακτήρες από κάθε συμβολοσειρά. Εάν είναι ίσοι, συνεχίζει με το επόμενο ζευγάρι χαρακτήρων μέχρι αυτοί να διαφέρουν ή μέχρι να φτάσει σε χαρακτήρα '\0'.
  • Εάν η συνάρτηση επιστρέψει θετική τιμή, σημαίνει ότι ο πρώτος χαρακτήρας που διαφέρει έχει μεγαλύτερη τιμή στην συμβολοσειρά str1 από την str2. Αρνητική τιμή σημαίνει το αντίθετο. Μηδέν σημαίνει ότι οι συμβολοσειρές είναι ίδιες.

 

Παράδειγμα:

Kώδικας προγράμματος

#include <stdio.h>
#include <string.h>

main()
{
char color[] = "blue";
char str[80], str1[80], str2[80];
int flag=1, max;

printf("Enter 2 words: ");
scanf("%s", str1);
scanf("%s", str2);
max=strcmp(str1, str2);
printf("\"%s\" is ", str1);
if (max>0) printf("after ");
if (max<0) printf("before ");
if (max==0) printf("equal to ");
printf("\"%s\" according to ASCII\n", str2);
printf ("Guess the color!\n");
while(flag!=0)
  { scanf("%s", str);
     flag=strcmp(color, str);
     if (flag!=0)
     printf("Try again!\n");
   }
printf("Correct answer!");


}

Αποτέλεσμα προγράμματος

C:\Proteas>strcmp.exe
Enter 2 words: hello world
"hello" is before "world" according to ASCII
Guess the color!
yellow
Try again!
red
Try again!
blue
Correct answer!

Πρότυπη επικεφαλίδα: string.h
Σύνταξη: char * strcat ( char * str1, const char * str2)
Λειτουργία:

Προσαρτά ένα αντίγραφο της συμβολοσειράς str2 στο τέλος της str1, αφού πρώτα διαγράψει το '\0' της str1. Επιστρέφει το αποτέλεσμα στο όνομα της.

  • Η συμβολοσειρά str1 πρέπει να είναι αρκετά μεγάλη ώστε να μπορέσει να προσαρτηθεί η συμβολοσειρά str2.
  • Η strcat δεν αναλαμβάνει την δέσμευση της απαραίτητης μνήμης στην συμβολοσειρά str1. Είναι ευθύνη της καλούσας συνάρτησης να το κάνει αυτό.
  • Η δήλωση const σε παραμέτρους της συνάρτησης σημαίνει ότι οι αντίστοιχες συμβολοσειρές δεν θα μεταβληθούν από την συνάρτηση.
  • H strcat προσθέτει έναν χαρακτήρα '\0' στο τέλος της προσαρτημένης συμβολοσειράς.

 

Παράδειγμα:

Kώδικας προγράμματος

#include <stdio.h>
#include <string.h>

main()
{
char str1[80];
char str2[80];

printf("Enter a string: ");
scanf("%s", str1);
strcat(str1, " ");
printf("Enter a second string: ");
scanf("%s", str2);
strcat(str1, str2);
strcat(str1, " beautiful day!");
printf("%s\n", str1);


}

Αποτέλεσμα προγράμματος

C:\Proteas>strcat.exe
Enter a string: It's
Enter a second string: a
It's a beautiful day!

Πρότυπη επικεφαλίδα: stdlib.h
Σύνταξη: int atoi ( const char * str )
Λειτουργία:

Μετατρέπει την συμβολοσειρά str, οι χαρακτήρες της οποίας είναι δεκαδικά ψηφία, στην αντίστοιχη αριθμητική τιμή, την οποία επιστρέφει στο όνομά της.

  • Η συνάρτηση αγνοεί τυχόν κενούς χαρακτήρες μέχρι να φτάσει στον πρώτο μη-κενό χαρακτήρα. Εάν αυτός ο χαρακτήρας δεν είναι δεκαδικός χαρακτήρας, δεν γίνεται μετατροπή.
  • Η atoi μετατρέπει και το πρόσημο (+ ή -) εάν αυτό υπάρχει.
  • Η συμβολοσειρά str μπορεί να περιέχει διάφορους χαρακτήρες μετά τα δεκαδικά ψηφία, οι οποίοι αγνοούνται.
  • Η δήλωση const στην παράμετρο της συνάρτησης σημαίνει ότι η συμβολοσειρά δεν θα μεταβληθεί από την συνάρτηση.
  • Εάν η atoi αποτύχει να κάνει την μετατροπή, επιστρέφει μηδέν.

 

Παράδειγμα:

Kώδικας προγράμματος

#include <stdio.h>
#include <stdlib.h>

main()
{
int i;
char str1 [100];

printf ("Enter a number: ");
scanf("%s", str1);
i = atoi (str1);
printf ("The value entered is %d. ", i);
printf("The value squared is %d.\n", i*i);
printf ("Enter another number: ");
scanf("%s", str1);
i = atoi (str1);
printf ("The value increased by 1 is: %d\n", i+1);


}

Αποτέλεσμα προγράμματος

C:\Proteas>atoi.exe
Enter a number: 569
The value entered is 569. The value squared is 323761.
Enter another number: 100050065
The value increased by 1 is: 100050066

Πρότυπη επικεφαλίδα: stdio.h
Σύνταξη: int puts ( const char * str )
Λειτουργία:

Γράφει την συμβολοσειρά str στο stdout, και αμέσως μετά έναν χαρακτήρα αλλαγής γραμμής (\n).

  • Επιστρέφει το πλήθος των χαρακτήρων που γράφτηκαν, ή EOF σε περίπτωση λάθους.
  • Χρησιμοποιώντας την συνάρτηση fputs με όρισμα το stdout,
    ( fputs(str, stdout) ), έχουμε το ίδιο αποτέλεσμα με την puts, αλλά χωρίς τον χαρακτήρα αλλαγής γραμμής στο τέλος της συμβολοσειράς str.

 

Παράδειγμα:

Kώδικας προγράμματος

#include <stdio.h>


main()
{
char *str1 = "This is";
char *str2 = "a test phrase";
char *str3 = "to show how the puts function works";
puts (str1);
puts (str2);
puts (str3);


}

Αποτέλεσμα προγράμματος

C:\Proteas>puts.exe
This is
a test phrase
to show how the puts function works

Πρότυπη επικεφαλίδα: stdio.h
Σύνταξη: char * fgets ( char * buf, int max, FILE * stream )
Λειτουργία:

Διαβάζει το πολύ max-1 χαρακτήρες από το ρεύμα stream, και τους τοποθετεί στη συμβολοσειρά buf, η οποία τερματίζεται με τον χαρακτήρα '\0'. Εάν συναντήσει αλλαγή γραμμής (\n) σταματάει, και συμπεριλαβάνει την αλλαγή γραμμής μαζί με τους υπόλοιπους χαρακτήρες στη συμβολοσειρά buf.

  • Επιστρέφει την συμβολοσειρά buf, ή NULL σε περίπτωση που συναντηθεί το τέλος του αρχείου ή συμβεί κάποιο λάθος.
  • Με χρήση των συναρτήσεων ferror ή feof μπορεί να διαπιστωθεί εάν έγινε κάποιο λάθος ή εάν τελείωσε το αρχείο.

 

Παράδειγμα:

Kώδικας προγράμματος

#include <stdio.h>


main()
{
FILE * myfile;
char buffer [100];

myfile = fopen ("input.txt" , "r");
if (myfile == NULL)
  { printf ("Error opening file\n");
    return 1;
  }
else
  {
    fgets (buffer , 100 , myfile);
    puts (buffer);
    printf("Type something: ");
    fgets (buffer, 31, stdin);
    puts (buffer);
    fclose (myfile);
  }

}

Αρχείο εισόδου προγράμματος

This small program will only print until the end of the line
in this example.

Αποτέλεσμα προγράμματος

C:\Proteas>fgets.exe
This small program will only print until the end of the line

Type something: this time only the first 30 characters will be printed!
this time only the first 30 ch

Πρότυπη επικεφαλίδα: stdio.h
Σύνταξη: FILE * fopen ( const char * filename, const char * mode )
Λειτουργία:

Ανοίγει το αρχείο με όνομα filename για να χρησιμοποιηθεί με τρόπο που περιγράφεται στο mode.

  • Επιστρέφει ένα ρεύμα με βάση στο οποίο μπορούμε στη συνέχεια να αναφερόμαστε στο αρχείο ή NULL, έαν για κάποιο λόγο δεν είναι δυνατόν να ανοίξει το αρχείο.
  • Το όνομα του αρχείου μπορεί να είναι το πολύ FILENAME_MAX χαρακτήρες. Το πολύ FOPEN_MAX αρχεία μπορεί να είναι ανοιγμένα ταυτόχρονα. Οι μεταβλητές FILENAME_MAX και FOPEN_MAX είναι ορισμένες στην επικεφαλίδα stdio.h
  • Οι τιμές του mode μπορεί να είναι:
    • "r": Για διάβασμα από υπάρχον αρχείο.
    • "w": Για γράψιμο σε αρχείο. Αν το αρχείο δεν υπάρχει, δημιουργείται. Αν υπάρχει, τα προηγούμενα περιεχόμενά του διαγράφονται και το γράψιμο αρχίζει από την αρχή του αρχείου.
    • "a": Για προσθήκη σε αρχείο. Αν το αρχείο υπάρχει ήδη, τα προηγούμενα περιεχόμενά του δεν διαγράφονται και το γράψιμο γίνεται στο τέλος του αρχείου. Εάν δεν υπάρχει, το αρχείο δημιουργείται.
    • "r+": Άνοιγμα υπάρχοντος αρχείου για διάβασμα και γράψιμο, οπουδήποτε μέσα στο αρχείο, χωρίς διαγραφή των προηγούμενων περιεχομένων του.
    • "w+": Άνοιγμα αρχείου για διάβασμα και γράψιμο, οπουδήποτε μέσα στο αρχείο. Εάν το αρχείο υπάρχει, τα προηγούμενα περιεχόμενά του διαγράφονται. Εάν δεν υπάρχει, δημιουργείται.
    • "a+": Για διάβασμα από οπουδήποτε μέσα σε υπάρχον αρχείο και γράψιμο μόνο στο τέλος του, χωρίς διαγραφή των προηγούμενων περιεχομένων του. Εάν το αρχείο δεν υπάρχει, δημιουργείται.
  • Για τις τιμές του mode που επιτρέπουν διάβασμα και γράψιμο (αυτές που έχουν το "+"), μεταξύ ενός διαβάσματος και ενός γραψίματος (ή το αντίστροφο) στο αρχείο, πρέπει να καλείται η συνάρτηση fflush ή μία συνάρτηση τοποθέτησης (όπως η fseek).
  • Σε ορισμένα συστήματα όπου γίνεται διάκριση μεταξύ αρχείων κειμένου και δυαδικών αρχείων, εάν θέλουμε να χειριστούμε ένα δυαδικό αρχείο, πρέπει στο mode να προστεθεί και ο χαρακτήρας b, δηλαδή να έχουμε ανάλογα με την περίπτωση "rb", "wb", "ab", "r+b" ("rb+"), "w+b" ("wb+"), "a+b" ("ab+"). Στo UNIX πάντως δεν υπάρχει τέτοια διάκριση.
  • To FILE είναι μία δομή (ορισμένη στο stdio.h) με κατάλληλα μέλη για να γίνεται ο χειρισμός του αρχείου.

 

Παράδειγμα:

Kώδικας προγράμματος

#include <stdio.h>

main()
{
FILE * myfile;
myfile = fopen ("output.txt", "w");
if (myfile!=NULL)
  {
    fprintf (myfile, "This is an example for the fopen function.");
    printf("The \"output.txt\" file has been created because
    it did not exist.\n");
    fclose (myfile);
  }

}

Αποτέλεσμα προγράμματος

C:\Proteas>fopen.exe
The "output.txt" file has been created because it did not exist.

Αρχείο εξόδου προγράμματος

This is an example for the fopen function.

Πρότυπη επικεφαλίδα: stdio.h
Σύνταξη: int fclose ( FILE * stream )
Λειτουργία:

Κλείνει το αρχείο με το οποίο συνδέεται το ρεύμα stream.

  • Επιστρέφει μηδέν ή EOF, σε περίπτωση επιτυχίας ή αποτυχίας, αντίστοιχα.
  • Τα τυχόν άγραφα δεδομένα για εγγραφή που βρίσκονται στην περιοχή ενδιάμεσης αποθήκευσης (buffer) γράφονται στο αρχείο, ενώ τα τυχόν μη διαβασμένα δεδομένα ανάγνωσης που βρίσκονται στην περιοχή ενδιάμεσης αποθήκευσης απορρίπτονται.
  • Ακόμα και εάν η fclose αποτύχει να κλείσει το αρχείο, το ρεύμα stream παύει να συνδέεται με αυτό.

 

Παράδειγμα:

Kώδικας προγράμματος

#include <stdio.h>

main()
{
FILE * myfile;
int check;
printf("Opening file...\n");
myfile = fopen ("input.txt", "r+");
if (myfile!=NULL)
  { printf("File successfully opened!\n");
    printf("Closing file...\n");
    check = fclose (myfile);
    if (check==0)
      printf("File successfully closed!\n");
  }

}

Αποτέλεσμα προγράμματος

C:\Proteas>fclose.exe
Opening file...
File successfully opened!
Closing file...
File successfully closed!

Πρότυπη επικεφαλίδα: stdio.h
Σύνταξη: int feof ( FILE * stream )
Λειτουργία:

Επιστρέφει μη μηδενική τιμή αν έχουν διαβαστεί όλα τα δεδομένα από το ρεύμα stream, δηλαδή έχουμε φτάσει στο τέλος του αρχείου που αντιστοιχεί στο ρεύμα, αλλιώς επιστρέφει μηδέν.

  • Η ένδειξη τέλους του αρχείου θα έχει τεθεί από μία προηγούμενη συνάρτηση η οποία έφτασε στο τέλος του αρχείου.
  • Τυχόν επόμενες ενέργειες πάνω στο ρεύμα, αφού έχει φτάσει στο τέλος του αρχείου, θα αποτύχουν, μέχρι να χρησιμοποιηθούν συναρτήσεις τοποθέτησης στο αρχείο (fseek, rewind, fsetpos), για να μετακινήσουν τον δείκτη θέσης του αρχείου.

 

Παράδειγμα:

Kώδικας προγράμματος

#include <stdio.h>

main()
{
FILE * myfile;
int counter = 0;
myfile = fopen ("input.txt", "r");
if (myfile!=NULL)
 {
   while (!feof(myfile))
    {
      fgetc (myfile);
      counter++;
    }
   fclose (myfile);
   printf ("Total number of characters in the file: %d\n", counter-1);
 }

}

Αρχείο εισόδου προγράμματος

This program counts the characters of a file.

Αποτέλεσμα προγράμματος

C:\Proteas>feof.exe
Total number of characters in the file: 45

Πρότυπη επικεφαλίδα: stdio.h
Σύνταξη: int getc ( FILE * stream )
Λειτουργία:

Επιστρέφει τον επόμενο χαρακτήρα από το ρεύμα stream.

  • Εάν έχει φτάσει στο τέλος του αρχείου ή συμβεί κάποιο λάθος στην ανάγνωση, η getc επιστρέφει EOF. Με χρήση της ferror ή της feof μπορεί να διαπιστωθεί εάν έγινε κάποιο λάθος ή εάν τελείωσε το αρχείο.
  • H getc είναι ισοδύναμη με την fgetc, με τη διαφορά ότι αν είναι μακροεντολή, ενδέχεται να υπολογίσει το stream περισσότερες από μία φορές.

 

Παράδειγμα:

Kώδικας προγράμματος

#include <stdio.h>

main()
{
FILE * myfile;
char c;
int counter1 = 0, counter2 = 0;

myfile=fopen("input.txt", "r");
if (myfile!=NULL)
 {
   do {
     c = getc (myfile);
     if (c == 'a') counter1++;
     else if (c=='e') counter2++;
   } while (c != EOF);

   fclose (myfile);
   printf ("File contains %d 'a' and %d 'e'.\n", counter1, counter2);
 }

}

Αρχείο εισόδου προγράμματος

This program counts the number of "a" and "e" in a file.

Αποτέλεσμα προγράμματος

C:\Proteas>getc.exe
File contains 4 'a' and 4 'e'.

Πρότυπη επικεφαλίδα: stdio.h
Σύνταξη: int putc ( int c, FILE * stream )
Λειτουργία:

Γράφει τον χαρακτήρα c στο ρεύμα stream. Επιστρέφει τον χαρακτήρα αυτό, ή EOF σε περίπτωση λάθους.

  • H putc είναι ισοδύναμη με την fputc, με τη διαφορά ότι αν είναι μακροεντολή, ενδέχεται να υπολογίσει το stream περισσότερες από μία φορές.

 

Παράδειγμα:

Kώδικας προγράμματος

#include <stdio.h>

main()
{
FILE * myfile;
char c;

myfile=fopen("alphabet_and_numbers.txt", "w");
for (c = 'A' ; c <= 'Z' ; c++)
  {
    putc (c, myfile);
  }

putc(' ', myfile);

for (c = '0' ; c <= '9' ; c++)
  {
    putc (c, myfile);
  }
fclose (myfile);

}

Αρχείο εξόδου προγράμματος

ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789

Πρότυπη επικεφαλίδα: stdio.h
Σύνταξη: int ungetc ( int c, FILE * stream )
Λειτουργία:

Επιστρέφει τον χαρακτήρα c στο ρεύμα stream, απ' όπου θα διαβαστεί με την επόμενη ανάγνωση. Επιστρέφει τον χαρακτήρα αυτό, ή EOF σε περίπτωση λάθους.

  • Ο χαρακτήρας c μπορεί και να μην είναι ο χαρακτήρας που διαβάστηκε τελευταίος από το ρεύμα stream.
  • Η ungetc επηρεάζει μόνο την επόμενη ανάγνωση από το ρεύμα stream, χωρίς να αλλάξει το περιεχόμενο του αρχείου με το οποίο αυτό συνδέεται.
  • Η χρήση της fseek, fsetpos ή της rewind στο ρεύμα stream θα απορρίψει τους χαρακτήρες που επιστράφηκαν με χρήση της ungetc.
  • Εάν η προηγούμενη ανάγνωση είχε φτάσει στο τέλος του αρχείου, η χρήση της ungetc θα αναιρέσει την ένδειξη τέλους του αρχείου.
  • Ο χαρακτήρας EOF δεν μπορεί να επιστραφεί.
  • Με διαδοχικές κλήσεις τις ungetc μπορούν να επιστραφούν πολλοί χαρακτήρες, οι οποίοι στη συνέχεια θα διαβαστούν με την αντίστροφη σειρά από αυτήν που επιστράφηκαν.

 

Παράδειγμα:

Kώδικας προγράμματος

#include <stdio.h>

main()
{
FILE * myfile;
char c;
int flag=0;

myfile = fopen ("input.txt", "r");
if (myfile!=NULL)
 while (!feof (myfile))
   {
     c=getc (myfile);
     putchar(c);
     if (c == '\n' && !flag)
      { ungetc ('#', myfile);
         ungetc (c, myfile);
         flag=1;
      }
      else if (c == '\n' && flag)
         flag=0;
   }
fclose(myfile);

}

Αρχείο εισόδου προγράμματος

This program prints these lines.
However it puts an extra newline character
and a "#" character
after each new line.
		

Αποτέλεσμα προγράμματος

C:\Proteas>ungetc.exe
This program prints these lines.

#However it puts an extra newline character

#and a "#" character

#after each new line. 

Πρότυπη επικεφαλίδα: stdio.h
Σύνταξη: int fprintf ( FILE * stream, const char * format, <op1>, <op2>, ...)
Λειτουργία:

Γράφει στο ρεύμα stream τα ορίσματα <op1>, <op2>, ..., σύμφωνα με την οδηγία της συμβολοσειράς format, και επιστρέφει το πλήθος των χαρακτήρων που γράφτηκαν, ή αρνητική τιμή σε περίπτωση λάθους.

  • Η χρήση της συνάρτησης fprintf είναι ίδια με αυτήν της printf, με την διαφορά ότι η fprintf έχει ένα παραπάνω όρισμα, το οποίο ορίζει το ρεύμα στο οποίο θα γράψει.
  • Η printf είναι ισοδύναμη με την fprintf(stdout, format....)

 

Παράδειγμα:

Kώδικας προγράμματος

#include <stdio.h>

main()
{
FILE * myfile;
char name[20];

myfile = fopen ("output.txt", "w");
puts("Enter your name: ");
scanf("%s", name);
fprintf (myfile, "Printing your name in the file: %s", name);
fprintf (stdout, "Printing your name on the screen: %s", name);
fclose (myfile);


}

Αποτέλεσμα προγράμματος

C:\Proteas>fprintf.exe
Enter your name:
Emmanuel
Printing your name on the screen: Emmanuel 

Αρχείο εξόδου προγράμματος

Printing your name in the file: Emmanuel
		

Πρότυπη επικεφαλίδα: stdio.h
Σύνταξη: int fscanf ( FILE * stream, const char * format, <op1>, <op2>, ...)
Λειτουργία:

Διαβάζει από το ρεύμα stream δεδομένα, σύμφωνα με την συμβολοσειρά format, και τα αποθηκεύει εκεί που δείχνουν οι δείκτες <op1>, <op2> .... Επιστρέφει το πλήθος των αντικειμένων που διαβάστηκαν ή EOF, αν έχει διαβαστεί όλη η είσοδος.

  • Η χρήση της συνάρτησης fscanf είναι ίδια με αυτήν της scanf, με την διαφορά ότι η fscanf έχει ένα παραπάνω όρισμα, το οποίο ορίζει το ρεύμα από το οποίο θα διαβάσει.
  • Η scanf είναι ισοδύναμη με την fscanf(stdin, format....)

 

Παράδειγμα:

Kώδικας προγράμματος

#include <stdio.h>

main()
{
char str1 [80], str2[80], str3[80];
char str4[80], str5[80], str6[80];
FILE * myfile;

myfile = fopen ("input.txt", "r");

fscanf (myfile, "%s %s %s", str1, str2, str3);
printf("Type 3 colors: ");
fscanf(stdin, "%s %s %s", str4, str5, str6);
fclose (myfile);
printf (" %s - %s\n %s - %s\n %s - %s\n", str1, str4, str2, str5, str3, str6);

}

Αρχείο εισόδου προγράμματος

Bill       Margaret


John
		

Αποτέλεσμα προγράμματος

C:\Proteas>fscanf.exe
Type 3 colors: red blue green
 Bill - red
 Margaret - blue
 John - green

Πρότυπη επικεφαλίδα: stdio.h
Σύνταξη: int fprintf ( char * str, const char * format, <op1>, <op2>, ...)
Λειτουργία:

Γράφει στη συμβολοσειρά str τα ορίσματα <op1>, <op2>, ..., σύμφωνα με την οδηγία της συμβολοσειράς format, και επιστρέφει το πλήθος των χαρακτήρων που γράφτηκαν, ή αρνητική τιμή σε περίπτωση λάθους.

  • Η χρήση της συνάρτησης sprintf είναι ίδια με αυτήν της printf, με την διαφορά ότι η sprintf έχει ένα παραπάνω όρισμα, το οποίο ορίζει τη συμβολοσειρά στην οποία θα γράψει.
  • H συμβολοσειρά str τερματίζεται με '\0'. Η επιστρεφόμενη μέτρηση δεν περιλαμβάνει το '\0'.
  • Η συμβολοσειρά str πρέπει να είναι αρκετά μεγάλη ώστε να χωράει το αποτέλεσμα.

 

Παράδειγμα:

Kώδικας προγράμματος

#include <stdio.h>

main()
{
char str [50];
int i, a=105, b=54;
i=sprintf (str, "%d * %d equals %d", a, b, a*b);
printf ("[%s] is %d a characters long string!\n", str, i);

}

Αποτέλεσμα προγράμματος

C:\Proteas>sprintf.exe
[105 * 54 equals 5670] is 20 a characters long string!

Πρότυπη επικεφαλίδα: stdio.h
Σύνταξη: int fscanf ( char * str, const char * format, <op1>, <op2>, ...)
Λειτουργία:

Διαβάζει από τη συμβολοσειρά str δεδομένα, σύμφωνα με την συμβολοσειρά format, και τα αποθηκεύει εκεί που δείχνουν οι δείκτες <op1>, <op2> .... Επιστρέφει το πλήθος των αντικειμένων που διαβάστηκαν ή EOF, αν έχει διαβαστεί όλη η είσοδος.

  • Η χρήση της συνάρτησης sscanf είναι ίδια με αυτήν της scanf, με την διαφορά ότι η sscanf έχει ένα παραπάνω όρισμα, το οποίο ορίζει τη συμβολοσειρά από την οποία θα διαβάσει.
  • Η συμβολοσειρά str πρέπει να έχει τουλάχιστον τόσα αντικείμενα όσα η sscanf θα διαβάσει από αυτήν.

 

Παράδειγμα:

00 Kώδικας προγράμματος

#include <stdio.h>

main()
{
char sentence []="I climbed a mountain when I was 15 years old.";
char str1[20], str2[20], str3[20];

sscanf (sentence, "%s %5s ed %*s %s", str1, str2, str3);
printf (" %s like %sing %ss!", str1, str2, str3);


}

Αποτέλεσμα προγράμματος

C:\Proteas>sscanf.exe
 I like climbing mountains!

Πρότυπη επικεφαλίδα: stdio.h
Σύνταξη: size_t fread ( void * ptr, size_t size, size_t count, FILE * stream )
Λειτουργία:

Διαβάζει από το ρεύμα stream το πολύ count δεδομένα μεγέθους size το καθένα και τα τοποθετεί από τη διεύθυνση του δείκτη ptr και μετά. Επιστρέφει το το πλήθος των δεδομένων που διαβάστηκαν.

  • Ο αριθμός των δεδομένων που διαβάστηκαν μπορεί να είναι μικρότερος από count, είτε γιατί η fread έφτασε στο τέλος του αρχείου που συνδέεται με το ρεύμα stream, είτε γιατί συνέβη κάποιο λάθος. Με χρήση της ferror ή της feof μπορεί να διαπιστωθεί ποια από τις δύο εκδοχές είναι αληθής.
  • Ο συνολικός αριθμός των byte που διαβάστηκαν σε περίπτωση επιτυχίας είναι size*count.

 

Παράδειγμα:

Kώδικας προγράμματος

#include <stdio.h>
#include <stdlib.h>
#define SIZE 40

main()
{
FILE * myfile;
char *buffer;
size_t result;

myfile = fopen ( "input.txt" , "r" );

if (myfile!=NULL)
  {
    buffer = malloc ((SIZE+1)*sizeof(char));
    if (buffer == NULL)
      { puts("Memory allocation error");
        return 1;
      }
    result = fread (buffer, 1, SIZE, myfile);
    if (result != SIZE) {puts ("Reading error"); return 1;}
    buffer[SIZE]='\0';
    printf("First %d characters of the file are: %s", SIZE/sizeof(char), buffer);
  }
fclose (myfile);
free (buffer);

}

Αρχείο εισόδου προγράμματος

This program is an example of the fread function.

Αποτέλεσμα προγράμματος

C:\Proteas>fread.exe
First 40 characters of the file are: This program is an example of the fread

Πρότυπη επικεφαλίδα: stdio.h
Σύνταξη: size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream )
Λειτουργία:

Γράφει στο ρεύμα stream το πολύ count δεδομένα μεγέθους size το καθένα, διαβάζοντας τα από τη διεύθυνση του δείκτη ptr και μετά. Επιστρέφει το το πλήθος των δεδομένων που γράφτηκαν.

  • Το πλήθος των δεδομένων που γράφτηκαν μπορεί να είναι μικρότερο από count, επειδή συνέβη κάποιο λάθος.
  • Ο συνολικός αριθμός των byte που γράφτηκαν σε περίπτωση επιτυχίας είναι size*count.

 

Παράδειγμα:

Kώδικας προγράμματος

#include <stdio.h>
#define SIZE 100

main()
{
FILE * file1, * file2;
char buffer[SIZE];
file1 = fopen ("input.txt" , "r" );
if (file1==NULL) {puts("Error opening file"); return 1;}
file2 = fopen ("output.txt" , "w" );
if (file2==NULL) {puts("Error opening file"); return 1;}

fread (buffer, 1, sizeof(buffer), file1);
fwrite (buffer, 1, sizeof(buffer), file2);
fclose (file1);
fclose (file2);

}

Αρχείο εισόδου προγράμματος

This small program copies the first 100 characters from the input file into the output file. The input file must have at least 100 characters.

Αρχείο εξόδου προγράμματος

This small program copies the first 100 characters from the input file into the output file. The inp

Πρότυπη επικεφαλίδα: stdio.h
Σύνταξη: int fseek ( FILE * stream, long int offset, int origin )
Λειτουργία:

Θέτει τη τρέχουσα θέση μέσα στο αρχείο που συνδέεται με το ρεύμα stream. Η νέα θέση προσδιορίζεται προσθέτοντας το offset στην θέση που ορίζεται από το origin.

  • Το origin μπορεί να είναι:
    • SEEK_SET. Η νέα θέση θα είναι offset χαρακτήρες (bytes) από την αρχή του αρχείου.
    • SEEK_CUR. Η νέα θέση θα είναι offset χαρακτήρες (bytes) από την τρέχουσα θέση.
    • SEEK_ΕND. Η νέα θέση θα είναι offset χαρακτήρες (bytes) από το τέλος του αρχείου.
  • Επιστρέφει μηδενική τιμή σε περίπτωση επιτυχίας, ή μη μηδενική τιμή σε περίπτωση λάθους.
  • Η ένδειξη τέλους του αρχείου ακυρώνεται μετά από κλήση της fseek. Τυχόν αλλαγές από προηγούμενες κλήσεις της ungetc απορρίπτονται.
  • Η χρήση της fseek σε αρχεία κειμένου (όχι δυαδικά) με τιμές του offset διάφορες του μηδενός ή τιμές που επιστρέφονται από την ftell, μπορεί σε κάποια συστήματα να έχει απροσδόκητα αποτελέσματα. (Στο Unix πάντως δεν υπάρχει διάκριση μεταξύ δυαδικών αρχείων και αρχείων κειμένου).
  • Σε ρεύματα που έχουν ανοιχτεί για γράψιμο και διάβασμα, η κλήση της fseek αλλάζει την λειτουργία από γράψιμο σε διάβασμα και αντίστροφα.

 

Παράδειγμα:

Kώδικας προγράμματος

#include <stdio.h>

main()
{
FILE * myfile;
long n;
myfile = fopen ( "output.txt" , "w" );
if (myfile!=NULL)
  { fputs ( "This is an  apple" , myfile );
    fseek ( myfile , 9 , SEEK_SET );
    fputs ( " exam" , myfile );
    fseek (myfile, 1, SEEK_END);
    fputs ("of the fseek function", myfile);
    fclose ( myfile );
  }

}

Αρχείο εξόδου προγράμματος

This is a example of the fseek function

Πρότυπη επικεφαλίδα: stdio.h
Σύνταξη: long int ftell ( FILE * stream )
Λειτουργία:

Επιστρέφει την τρέχουσα θέση στο αρχείο για το ρεύμα stream.

  • Σε περίπτωση λάθους επιστρέφει -1L, και η καθολική μεταβλητή errno παίρνει μια θετική τιμή. Αυτή η τιμή μπορεί να χρησιμοποιηθεί από την perror.
  • Για δυαδικά αρχεία, η τιμή που επιστρέφεται αντιστοιχεί στον αριθμό των byte από την αρχή του αρχείου μέχρι την τρέχουσα θέση. Για αρχεία κειμένου μπορεί η επιστρεφόμενη τιμή να μην αντιστοιχεί στον αριθμό των byte, αλλά μπορεί να χρησιμοποιηθεί για να θέσει ξανά την τρέχουσα θέση με χρήση της fseek (στο Unix δεν υπάρχει διάκριση μεταξύ δυαδικών αρχείων και αρχείων κειμένου).

 

Παράδειγμα:

Kώδικας προγράμματος

#include <stdio.h>

main()
{
FILE * myfile;
long size;

myfile = fopen ("input.txt", "r");
if (myfile==NULL) {puts("Error opening file"); return 1;}
else
  {
    fseek (myfile, 0, SEEK_END);
    size=ftell(myfile);
    fclose(myfile);
    printf ("Size of input.txt: %ld bytes.\n", size);
  }

}

Αρχείο εισόδου προγράμματος

This is an example of the ftell function. This text file's size is 76 bytes.

Αποτέλεσμα προγράμματος

C:\Proteas>ftell.exe
Size of input.txt: 76 bytes.

Πρότυπη επικεφαλίδα: stdio.h
Σύνταξη: int fflush ( FILE * stream )
Λειτουργία:

Αδειάζει το ρεύμα stream.

  • Εάν το ρεύμα stream είναι ρεύμα εξόδου, η fflush γράφει τυχόν δεδομένα που είναι στην περιοχή ενδιάμεσης αποθήκευσης αλλά δεν έχουν ακόμα γραφτεί στο stream.
  • Εάν το ρεύμα stream είναι ρεύμα εισόδου, το αποτέλεσμα της fflush εξαρτάται από την υλοποίηση. Σε κάποιες υλοποιήσεις αδειάζει το ρεύμα εισόδου από δεδομένα που βρίσκονται στην περιοχή ενδιάμεσης αποθήκευσης και δεν έχουν ακόμα διαβαστεί, αλλά αυτό δεν είναι πρότυπη συμπεριφορά.
  • Επιστρέφει μηδέν ή ΕΟF, σε περίπτωση επιτυχίας ή αποτυχίας αντίστοιχα.
  • Εάν το όρισμα της fflush είναι NULL, αδειάζει όλα τα ανοιχτά ρεύματα.
  • Το ρεύμα stream παραμένει ανοιχτό μετά από την κλήση της fflush.
  • Όταν ένα αρχείο κλείνει είτε με χρήση της fclose, είτε γιατί το πρόγραμμα τερματίζει, η περιοχή ενδιάμεσης αποθήκευσης αδειάζει αυτόματα.
  • Σε αρχείο που έχει ανοιχτεί και για διάβασμα και για γράψιμο, το ρεύμα του αρχείου πρέπει να αδειάζει μετά από το γράψιμο και πριν το διάβασμα. Αυτό μπορεί να συμβεί με καθορισμό της θέσης μέσα στο αρχείο (fseek, fsetpos, rewind), ή με κλήση της fflush.

 

Παράδειγμα:

Kώδικας προγράμματος

#include <stdio.h>

main()
{
FILE * myfile;
char buffer[80];
myfile = fopen ("example.txt", "r+");

if (myfile == NULL) {puts("Error opening file"); return 1;}
else
  {
    fputs ("Testing", myfile);
    fflush (myfile);
    fgets (buffer, 80, myfile);
    puts (buffer);
    fclose (myfile);
  }

}

Αρχείο προγράμματος πριν την εκτέλεση

Setting this file as an example to fflush.

Αποτέλεσμα προγράμματος

C:\Proteas>fflush.exe
 this file as an example to fflush.

Αρχείο προγράμματος μετά την εκτέλεση

Testing this file as an example to fflush.

Πρότυπη επικεφαλίδα: stdio.h
Σύνταξη: void perror ( const char * str )
Λειτουργία:

Εκτυπώνει την συμβολοσειρά str και μία περιγραφή του πιο πρόσφατου λάθους που έχει συμβεί.

  • Η perror συνδέεται με την τιμή της εξωτερικής μεταβλητής errno, που είναι ορισμένη στην επικεφαλίδα errno.h. Η perror ερμηνεύει την τιμή της errno, η οποία έχει τεθεί από το πιο πρόσφατο λάθος, και τυπώνει το ανάλογο μήνυμα στο ρεύμα stderr (πρότυπη έξοδος για τα λάθη, συνήθως η οθόνη). Το μήνυμα που θα τυπώσει η perror για κάθε λάθος εξαρτάται από την υλοποίηση.
  • Εάν η συμβολοσειρά str δεν είναι ο κενός δείκτης (NULL), η perror την εκτυπώνει, ακολουθούμενη από μία άνω και κάτω τελεία (:) και ένα κενό. Μετά, ασχέτως από το αν η συμβολοσειρά str ήταν NULL, η perror τυπώνει το μήνυμα που καθορίζεται από την τιμή της errno και έναν χαρακτήρα αλλαγής γραμμής (\n).
  • H perror πρέπει να καλείται αμέσως μετά το λάθος, αλλιώς η τιμή του errno μπορεί να αλλάξει από επόμενες συναρτήσεις.
  • Αν θέλουμε να χρησιμοποιήσουμε τη μεταβλητή errno μέσα σε ένα πρόγραμμα, πρέπει να έχουμε συμπεριλάβει το αρχείο επικεφαλίδας στο οποίο ορίζεται: #include <errno.h>.
  • H συνάρτηση perror είναι πολύ κατατοπιστική όταν χρησιμοποιούμε συναρτήσεις της πρότυπης βιβλιοθήκης της C, οι οποίες ενδέχεται να προκαλέσουν κάποιο λάθος, για παράδειγμα η malloc ή οι συναρτήσεις διαχείρισης αρχείων, όπως η fopen, και μας ενδιαφέρει να μάθουμε ποιο ακριβώς λάθος προκλήθηκε.

 

Παράδειγμα:

Kώδικας προγράμματος

#include <stdio.h>

main()
{
FILE *myfile;

myfile=fopen ("non_existant_file.txt", "r");
if (myfile==NULL)
  perror ("The following error occurred");
else
  fclose (myfile);

}

Αποτέλεσμα προγράμματος

C:\Proteas>perror.exe
The following error occurred: No such file or directory

Πρότυπη επικεφαλίδα: stdio.h
Σύνταξη: int fputs ( const char * str, FILE * stream )
Λειτουργία:

Γράφει τη συμβολοσειρά str στο ρεύμα stream.

  • Ο χαρακτήρας '\0' της συμβολοσειράς str δεν γράφεται στο ρεύμα stream.
  • Η συμβολοσειρά str δεν χρειάζεται να τελειώνει με μία αλλαγή γραμμής (\n), σε αντίθεση με την puts.
  • Επιστρέφει μη-αρνητική τιμή, ή EOF σε περίπτωση λάθους.

 

Παράδειγμα:

Kώδικας προγράμματος

#include <stdio.h>

main()
{
FILE * myfile;
char sentence [256];

myfile = fopen ("output.txt", "w");
fputs ("Enter a sentence: ", stdout);
fgets (sentence, 255, stdin);
fputs("Your sentence is: ", myfile);
fputs(sentence, myfile);
fclose (myfile);

}

Αποτέλεσμα προγράμματος

C:\Proteas>fputs.exe
Enter a sentence: Hello world!

Αρχείο εξόδου προγράμματος

Your sentence is: Hello world!

Πρότυπη επικεφαλίδα: string.h
Σύνταξη: char * strtok ( char * str, const char * symbols )
Λειτουργία:

Αναζητά στην συμβολοσειρά str λεκτικά σύμβολα που χωρίζονται με χαρακτήρες από τη συμβολοσειρά symbols. Επιστρέφει ένα δείκτη στο τελευταίο λεκτικό σύμβολο που βρέθηκε, ή NULL εάν δεν υπάρχουν άλλα λεκτικά σύμβολα στην str.

  • Στην πρώτη κλήση της strtok, η παράμετρος str είναι μια συμβολοσειρά, στην οποία η συνάρτηση ψάχνει για λεκτικά σύμβολα που χωρίζονται με χαρακτήρες από τη συμβολοσειρά symbols. Σε επόμενες κλήσεις της strtok, η παράμετρος str είναι NULL, έτσι ώστε η συνάρτηση να συνεχίσει την αναζήτηση από εκεί που σταμάτησε στην αμέσως προηγούμενη κλήση της.
  • Ένα λεκτικό σύμβολο αρχίζει με τον πρώτο χαρακτήρα που συναντά η strtok στην συμβολοσειρά str, ο οποίος δεν υπάρχει στην συμβολοσειρά symbols, και συμπεριλαμβάνει όλους τους επόμενους χαρακτήρες της str που επίσης δεν υπάρχουν στη symbols. Το λεκτικό σύμβολο τελειώνει με τον πρώτο χαρακτήρα που συναντά η strtok ο οποίος υπάρχει και στην συμβολοσειρά symbols.
  • Το κάθε λεκτικό σύμβολο τερματίζεται με '\0' και η strtok επιστρέφει ένα δείκτη στην αρχή του.
  • Όταν η strtok φτάσει στο τέλος της συμβολοσειράς str, επιστρέφει NULL.
  • Η δήλωση const σε παραμέτρους της συνάρτησης σημαίνει ότι οι αντίστοιχες συμβολοσειρές δεν θα μεταβληθούν από την συνάρτηση.

 

Παράδειγμα:

Kώδικας προγράμματος

#include <stdio.h>
#include <string.h>

main()
{
char str[] ="This string, will split into seperate words! using strtok.";
char * part;
printf ("Splitting string \"%s\":\n", str);
part = strtok (str, " !,.");

while (part != NULL)
  {
    printf ("%s\n", part);
    part = strtok (NULL, " !,.");
  }

}

Αποτέλεσμα προγράμματος

C:\Proteas>strtok.exe
Splitting string "This string, will split into seperate words! using strtok.":
This
string
will
split
into
seperate
words
using
strtok