Η πρότυπη βιβλιοθήκη
Διομήδης Σπινέλλης
Τμήμα Διοικητικής Επιστήμης και Τεχνολογίας
Οικονομικό Πανεπιστήμιο Αθηνών
dds@aueb.gr
Εισαγωγή
- Το πρότυπο ISO/ANSI της γλώσσας C ορίζει την πρότυπη
βιβλιοθήκη ως ένα σύνολο συναρτήσεων που πρέπει να παρέχονται
από υλοποιήσεις που είναι βασισμένες σε πλήρη υπολογιστή (hosted
implementations).
- Οι επόμενες σελίδες περιγράφουν πολύ αδρά τα περιεχόμενα
των βασικών συναρτήσεων κάθε κατηγορίας, έτσι ώστε να δοθεί μια
γενική εικόνα του περιεχομένου της βιβλιοθήκης.
Λεπτομέρειες για τη χρήση των συναρτήσεων υπάρχουν στη βιβλιογραφία.
Είσοδος και έξοδος
Επικεφαλίδα
#include <stdio.h>
Περιλαμβάνει
Συναρτήσεις για είσοδο και έξοδο στοιχείων και επεξεργασία αρχείων.
Βασικές συναρτήσεις
- fopen
- Επιστρέφει ένα ρεύμα (stream) για
την επεξεργασία ενός αρχείου.
- fclose
- Τερματίζει την επεξεργασία ενός αρχείου.
- printf
- Τυπώνει φορμαρισμένα στην έξοδο (stdout).
- fprintf
- Τυπώνει φορμαρισμένα σε αρχείο.
- sprintf
- Τυπώνει φορμαρισμένα σε συμβολοσειρά.
- fscanf
- Διαβάζει φορμαρισμένα από αρχείο.
- scanf
- Διαβάζει φορμαρισμένα από την είσοδο (stdin).
- getc
- Διαβάζει έναν χαρακτήρα από αρχείο.
- getchar
- Διαβάζει έναν χαρακτήρα από την είσοδο.
- putc
- Τυπώνει έναν χαρακτήρα σε αρχείο.
- putchar
- Τυπώνει έναν χαρακτήρα στην έξοδο.
- fread
- Διαβάζει στοιχεία από το αρχείο.
- fwrite
- Τυπώνει στοιχεία στο αρχείο.
- fseek
- Ορίζει τη θέση στο αρχείο
Παράδειγμα
Το παρακάτω παράδειγμα τυπώνει τα περιεχόμενα του αρχείου test.c:
#include <stdio.h>
main()
{
FILE *f;
int c;
f = fopen("test.c", "r");
while ((c = getc(f)) != EOF)
putchar(c);
}
Χαρακτηρισμός χαρακτήρων
Επικεφαλίδα
#include <ctype.h>
Περιλαμβάνει
Συναρτήσεις που χαρακτηρίζουν τον είδος ενός χαρακτήρα.
Βασικές συναρτήσεις
- isdigit
- Επιστρέφει αληθές αν ο χαρακτήρας είναι ψηφίο
- isalpha
- Επιστρέφει αληθές αν ο χαρακτήρας είναι αλφαβητικός
- isalnum
- Επιστρέφει αληθές αν ο χαρακτήρας είναι αλφαβητικός ή ψηφίο
- isspace
- Επιστρέφει αληθές αν ο χαρακτήρας είναι κάποιο κενό
- isupper
- Επιστρέφει αληθές αν ο χαρακτήρας είναι κεφαλαίος
- islower
- Επιστρέφει αληθές αν ο χαρακτήρας είναι πεζός
Οι παραπάνω συναρτήσεις σε πολλές υλοποιήσεις δεν υποστηρίζουν
τους ελληνικούς χαρακτήρες.
Παράδειγμα
Το παρακάτω παράδειγμα τυπώνει τον αριθμό των ψηφίων, πεζών και κεφαλαίων
χαρακτήρων που συναντά στην είσοδό του.
#include <stdio.h>
#include <ctype.h>
main()
{
int c;
int digits, upper, lower;
digits = upper = lower = 0;
while ((c = getchar()) != EOF) {
if (isdigit(c))
digits++;
if (isupper(c))
upper++;
if (islower(c))
lower++;
}
printf("digits = %d\n", digits);
printf("upper = %d\n", upper);
printf("lower = %d\n", lower);
}
Μαθηματικά
Επικεφαλίδα
#include <math.h>
Περιλαμβάνει
Μαθηματικές συναρτήσεις σε αριθμούς κινητής υποδιαστολής (double)
Βασικές συναρτήσεις
- sin
- Ημίτονο
- cos
- Συνημίτονο
- tan
- Εφαπτομένη
- asin
- Τόξο ημίτονου
- acos
- Τόξο συνημίτονου
- atan2
- Τόξο εφαπτομένης
- sinh
- Υπερβολικό ημίτονο
- cosh
- Υπερβολικό συνημίτονο
- log
- Φυσικός λογάριθμος
- pow
- Δύναμη
- sqrt
- Τετραγωνική ρίζα
- ceil
- Στρογγυλεύει προς τα άνω
- floor
- Στρογγυλεύει προς τα κάτω
- fmod
- Υπόλοιπο διαίρεσης
Παράδειγμα
Το παρακάτω παράδειγμα τυπώνει 3.1415...
#include <stdio.h>
#include <math.h>
main()
{
printf("%g\n", 2.0 * asin(1.0));
}
Βοηθητικές συναρτήσεις
Επικεφαλίδα
#include <stdlib.h>
Περιλαμβάνει
Συναρτήσεις μετατροπής αριθμών,
χρήσης δυναμικής μνήμης
(βλ. δυναμική διάθεση μνήμης),
λειτουργίας στο περιβάλλον του λειτουργικού συστήματος και
χρήσης ταξινομημένων πινάκων.
Βασικές συναρτήσεις
- atof
- Μετατρέπει συμβολοσειρά σε double
- atol
- Μετατρέπει συμβολοσειρά σε long
- atoi
- Μετατρέπει συμβολοσειρά σε int
- abs
- Επιστρέφει την απόλυτη τιμή ενός int
- max
- Επιστρέφει το μέγιστο δύο αριθμών
- min
- Επιστρέφει τον ελάχιστο δύο αριθμών
- rand
- Επιστρέφει έναν ψευδοτυχαίο αριθμό 0 - RAND_MAX
- srand
- Καθορίζει τη βάση εκκίνησης της rand
- malloc
- Δεσμεύει και επιστρέφει δυναμική μνήμη
- free
- Ελευθερώνει δυναμική μνήμη
- realloc
- Αλλάζει το μέγεθος ενός τμήματος δυναμικής μνήμης
- exit
- Τερματίζει το πρόγραμμα
- system
- Εκτελεί εντολή του λειτουργικού συστήματος
- getenv
- Επιστρέφει την τιμή μιας μεταβλητής του λειτουργικού συστήματος
- qsort
- Ταξινομεί έναν πίνακα
- bsearch
- Δυαδική αναζήτηση σε ταξινομημένο πίνακα
Παράδειγμα
Το παρακάτω παράδειγμα γεμίζει έναν πίνακα με ψευδοτυχαίους αριθμούς,
τον ταξινομεί και επιτρέπει στο χρήστη να ψάξει για έναν αριθμό
μέσα στον πίνακα.
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
/*
* Qsort/bsearch comparison function
*/
int
compare(const int *a, const int *b)
{
return (*a - *b);
}
/*
* Print an integer table contents using a given label
*/
void
dump_int_table(char *label, int *table, int nelem)
{
int i;
printf("%s\n", label);
for (i = 0; i < nelem; i++)
printf("(%d, %d) ", i, table[i]);
putchar('\n');
}
main()
{
int *tbl; /* Integer table */
char buff[10]; /* User input */
int n, i; /* User number, counter */
int *pos; /* Found position */
const int TABLE_SIZE = 64;
/* Randomize the random number generator using current time */
srand(time(NULL));
/* Allocate table memory */
tbl = (int *)malloc(TABLE_SIZE * sizeof(int));
/* Fill table with random numbers (0 - 2 * TABLE_SIZE) */
for (i = 0; i < TABLE_SIZE; i++)
tbl[i] = rand() % (TABLE_SIZE * 2);
dump_int_table("Table with random numbers", tbl, TABLE_SIZE);
/* Sort the table contents */
qsort(tbl, TABLE_SIZE, sizeof(int), compare);
dump_int_table("Sorted table with random numbers", tbl, TABLE_SIZE);
/* Read and convert a number from the user (without using scanf) */
printf("Search for which number? (0-%d):", 2 * TABLE_SIZE);
fgets(buff, sizeof(buff), stdin);
n = atoi(buff);
/* Search for the number and report result */
pos = bsearch(&n, tbl, TABLE_SIZE, sizeof(int), compare);
if (pos)
printf("The number %d is located at table position %d\n",
n, pos - tbl);
else
printf("The number %d is not in the table\n");
/* Free memory and exit - not strictly needed */
free(tbl);
exit(0);
}
Συμβολοσειρές
Επικεφαλίδα
#include <string.h>
Περιλαμβάνει
Συναρτήσεις επεξεργασίας συμβολοσειρών
(βλ. αναλυτικές σημειώσεις).
Διάγνωση
Επικεφαλίδα
#include <assert.h>
Περιλαμβάνει
Τη συνάρτηση assert
Βασικές συναρτήσεις
- assert
- Με τη δήλωση assert(x) ο προγραμματιστής δηλώνει
στο πρόγραμμα ότι με βάση το σχεδιασμό του περιμένει
ότι η χ θα είναι αληθής.
Αν η x δεν είναι αληθής το πρόγραμμα διακόπτει την εκτέλεσή του
με μήνυμα που πληροφορεί το χειριστή για το σημείο που παρουσιάστηκε
το πρόβλημα.
Παράδειγμα
Το παρακάτω παράδειγμα τυπώνει τους αριθμούς 0-9.
Στη συνέχεια θέλουμε να τυπώσει 20 με τη χρήση του i.
Για το σκοπό αυτό ελέγχουμε ότι το i στο τέλος του βρόχου είναι όντως 10.
#include <stdio.h>
#include <assert.h>
main()
{
int i;
for (i = 0; i < 10; i++)
printf("%d\n", i);
/* i should be 10 here */
assert(i == 10);
printf("%d\n", i + i);
}
Ώρα και ημερομηνία
Επικεφαλίδα
#include <time.h>
Περιλαμβάνει
Συναρτήσεις για την επεξεργασία ημερομηνίας και ώρας
Βασικές συναρτήσεις
- time
- Επιστρέφει την ώρα (σε δευτερόλεπτα από το 1970)
- localtime
- Μετατρέπει την ώρα από δευτερόλεπτα σε τοπική ώρα και την αποθηκεύει στη δομή struct tm
- asctime
- Μετατρέπει την ώρα από τη δομή σε συμβολοσειρά.
- difftime
- Επιστρέφει τη διαφορά ανάμεσα σε δύο ώρες
Παράδειγμα
Το παρακάτω παράδειγμα τυπώνει την τοπική ώρα.
#include <stdio.h>
#include <time.h>
main()
{
struct tm local;
time_t now;
time(&now);
local = *localtime(&now);
printf("%s\n", asctime(&local));
}
Όρια υλοποίησης
Επικεφαλίδα
#include <limits.h>
#include <float.h>
Περιλαμβάνει
Σταθερές που ορίζουν τα όρια των ακεραίων και αριθμών κινητής
υποδιαστολής για τη συγκεκριμένη υλοποίηση.
Βασικές τιμές
- CHAR_MAX
- Ο μέγιστος char
- CHAR_MIN
- Ο ελάχιστος char
- INT_MAX
- Ο μέγιστος int
- INT_MIN
- Ο ελάχιστος int
- DBL_MAX
- Ο μέγιστος double
- DBL_MIN
- Ο ελάχιστος double
- DBL_DIG
- Τα δεκαδικά ψηφία ακρίβειας των double
Παράδειγμα
Το παρακάτω παράδειγμα τυπώνει τα όρια της υλοποίησης.
#include <stdio.h>
#include <limits.h>
#include <float.h>
main()
{
printf("CHAR_MAX=%d\n", CHAR_MAX);
printf("CHAR_MIN=%d\n", CHAR_MIN);
printf("INT_MAX=%d\n", INT_MAX);
printf("INT_MIN=%d\n", INT_MIN);
printf("DBL_MAX=%g\n", DBL_MAX);
printf("DBL_MIN=%g\n", DBL_MIN);
printf("DBL_DIG=%d\n", DBL_DIG);
}
Στην υλοποίηση Visual C++ 5.00 τυπώνει:
CHAR_MAX=127
CHAR_MIN=-128
INT_MAX=2147483647
INT_MIN=-2147483648
DBL_MAX=1.79769e+308
DBL_MIN=2.22507e-308
DBL_DIG=15
Ασκήσεις
Πρότυπη βιβλιοθήκη
- Να βρείτε και να διαβάσετε την τεκμηρίωση για τη συνάρτηση
rename.
Γράψτε ένα πρόγραμμα που να τη χρησιμοποιεί.
Η άσκηση είναι προαιρετική.
Βιβλιογραφία
- Brian W. Kernighan, Dennis M. Ritchie
Η γλώσσα προγραμματισμού C. σ. 337-349
Δεύτερη έκδοση.
Κλειδάριθμος, 1988.
- Chuck Allison.
The Standard C library, part 1.
C Users Journal, 13(1):69, January 1995.
- Chuck Allison.
The Standard C library, part 2.
C Users Journal, 13(2):89, February 1995.
- Chuck Allison.
The Standard C library, part 3.
C Users Journal, 13(3):59, March 1995.
- American National
Standard for Information Systems — programming language — C:
ANSI X3.159–1989.
Published by the American National Standards Institute, 1430 Broadway, New
York, New York 10018, December 1989.
(Also ISO/IEC 9899:1990).
- Brian W. Kernighan
and Dennis M. Ritchie.
The C
Programming Language, pages 241–258.
Prentice-Hall, second edition, 1988.
- P. J. Plauger.
The Standard C Library.
Prentice Hall, 1992.