Table of Contents
Yleiskatsaus C-standardikirjastoon
C Standard Library on kokoelma toimintoja, makroja ja tyyppimääritelmiä, jotka on annettu osana ISO C ohjelmointikielistandardia. Se antaa kehittäjille kannettavan, hyvin testatun perustan yhteisille tehtäville, kuten syöte/tuotos, merkkijonon käsittely, muistinjako, matemaattinen laskenta ja päivämäärä/aika manipulointi. Luottamalla standardikirjastoon, sen sijaan että kirjoittaisit mukautettuja ratkaisuja, vähennät vikoja, parannat koodien luettavuutta ja varmistat, että ohjelmasi toimivat johdonmukaisesti eri alustoilla ja kääntäjillä.
Kirjasto on järjestetty useisiin otsikon tiedostoihin, kuhunkin ryhmittelyyn liittyvä toiminnallisuus. Ymmärtäminen mitä kukin otsikko tarjoaa on ensimmäinen askel kirjoittaa tehokas ja ylläpidettävissä C-koodi. Alla tutustumme tärkeimpiin otsikoihin ja niiden ydintoimintoihin sekä käytännön esimerkkeihin, jotka osoittavat, miten ne yksinkertaistavat päivittäistä ohjelmointia.
Olennaiset otsikot ja niiden toiminnot
<stio.h > ...
-otsikko tarjoaa toimintoja, jotka lukevat ja kirjoittavat standardivirtaan (stdin, stdout, stderr) ja tiedostoihin. Ilman sitä sinun pitäisi toteuttaa matalan tason järjestelmäpuheluita tai kirjoittaa oma puskurikerros. Avaintoiminnot ovat:
- [] [][][] .
- [][] [][[] .] .
- [] [] [] [ .] .
- [][] [][] .
- [[]] / [[[] .
Esimerkki:[ Käyttäjältä ilman puskurin ylivuotoa saadun viivan lukeminen on yksinkertaista :
#include <stdio.h>
int main() {
char buffer[100];
printf("Enter a line: ");
if (fgets(buffer, sizeof(buffer), stdin)) {
printf("You entered: %s", buffer);
}
return 0;
}
<stdlib.h> ... ...............................................................................................................................................................................................................................................
sisältää toimintoja dynaamisen muistin jako, satunnaislukujen luominen, prosessinohjaus ja muuntaminen. Nämä ovat välttämättömiä ohjelmia, joiden on jaettava muistia ajon aikana tai suorittaa järjestelmän tason toimintoja.
- ][][[]] [[[[]] [[[]][[[[]]] [[[[[]][[[[][[[[] .] .]]
- [LLT:0]][[[LLT:18]][[[LLT:1]]]] [[[LLT:2]][[[LLT:3]]]] [[[LLT:4]][[[[LLT:20]]][[[[LLT:5]]] ] .
- [[]] [[] .] Pseudo-satunnaislukujen sukupolvi.
- [], [[[] .
- [[ .] .
- [[] .
Esimerkki:[ Järjestetään joukko kokonaislukuja on paljon yksinkertaisempi kuin omanlaisen rutiinin kirjoittaminen:
#include <stdio.h>
#include <stdlib.h>
int compare(const void *a, const void *b) {
return (*(int*)a - *(int*)b);
}
int main() {
int arr[] = {42, 3, 71, 1, 9};
size_t n = sizeof(arr) / sizeof(arr[0]);
qsort(arr, n, sizeof(int), compare);
for (size_t i = 0; i < n; i++)
printf("%d ", arr[i]);
printf("\n");
return 0;
}
< String.h > ...
C-merkkijonojen (null-päättyneet merkkien ryhmät) kanssa työskentely on virhealtis ilman vakiokirjastoa. [] tarjoaa turvallisia ja tehokkaita toimintoja jousien kopiointiin, koncatalisointiin, vertailuun ja etsimiseen sekä muistilohkon toimintoihin.
- []] [[[ ] . Kopioi jouset.
- []] [[[ ] .
- [][]] [[ ] .
- [LUOTTA:0] [[LUT:36]][[[LLT:1]] ] [Letku:]
- [[]] [[ ] [ ] .
- [][]] [[]] [[[[] .
- [[ ] .
Esimerkki:[] Kassakaappi, jossa on kaksi jousta :
#include <stdio.h>
#include <string.h>
int main() {
char dest[20] = "Hello, ";
const char *src = "World!";
strncat(dest, src, sizeof(dest) - strlen(dest) - 1);
printf("%s\n", dest);
return 0;
}
<matematiikka.h> ... ...............................................................................................................................................................................................................................................
:n mukaan tieteellisissä ja teknisissä sovelluksissa on kelluvia pisteitä, kuten , , , , [ ja . Nämä ovat laitteistooptimoituja ja paljon tarkempia kuin naiivit implementointitoimet.
- [ ] .
- ][][]] [[]] [[][[[][[[] .
- [[]] [[[] .] .
- [[ .] .
- [LLT:0]][[[LLT:59]][[[LLT:1]] ] .
Esimerkki:[ Laske kahden pisteen välinen etäisyys:
#include <stdio.h>
#include <math.h>
int main() {
double x1 = 1.0, y1 = 2.0, x2 = 4.0, y2 = 6.0;
double dx = x2 - x1, dy = y2 - y1;
double distance = sqrt(dx*dx + dy*dy);
printf("Distance: %.2f\n", distance);
return 0;
}
< ctype.h > ...
-luokituksen ja muunnoksen mukaiset merkit: , , , [-luokituksen mukaiset toiminnot. Ne käsittelevät paikallisia sääntöjä ja ovat turvallisempia kuin manuaalisten vertailujen kirjoittaminen.
Esimerkki:[ Muunnetaan merkkijono isoiksi kirjaimiksi:
#include <stdio.h>
#include <ctype.h>
int main() {
char str[] = "Hello, World!";
for (int i = 0; str[i]; i++)
str[i] = toupper(str[i]);
printf("%s\n", str);
return 0;
}
< time.h> ... ................................................................................................................................................................................................................................................
tarjoaa toimintoja, joilla saadaan nykyinen aika, mitata kulunut aika, ja muoto päivämäärä / aika merkkijonot. Hyödyllinen kirjaukseen, profilointi, ja aikataulutus.
- [[ ] .
- [[] . .
- [[ ] .
- [ ] .
- [[]] [[[ ] .
Esimerkki:[ Tulosta nykyinen päivämäärä ja kellonaika:
#include <stdio.h>
#include <time.h>
int main() {
time_t t = time(NULL);
struct tm *tm_info = localtime(&t);
char buffer[26];
strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", tm_info);
printf("Current time: %s\n", buffer);
return 0;
}
Käytännön esimerkkejä, jotka näyttävät Standard Libraryn voimaa
Tiedoston lukeminen turvallisesti
Tekstitiedostorivi riviltä on yleinen vaatimus. Käyttämällä estää puskurin ylivuotoa ja / käsittelee tiedoston loppu- ja virheolosuhteita.
#include <stdio.h>
#include <stdlib.h>
int main() {
FILE *fp = fopen("data.txt", "r");
if (!fp) {
perror("fopen");
return EXIT_FAILURE;
}
char line[256];
while (fgets(line, sizeof(line), fp)) {
printf("%s", line);
}
if (ferror(fp))
perror("fgets");
fclose(fp);
return 0;
}
Dynaaminen kaari merkkijonot
Kirjasto , ja (jos saatavilla) yksinkertaistavat prosessia. Huomautus: ei ole ISO C-toiminto, vaan sitä tuetaan laajasti; voit käyttää myös + .
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char *words[] = {"apple", "banana", "cherry", "date"};
size_t num_words = sizeof(words) / sizeof(words[0]);
// Allocate array of char pointers
char **copy = malloc(num_words * sizeof(char*));
if (!copy) return EXIT_FAILURE;
for (size_t i = 0; i < num_words; i++) {
copy[i] = malloc(strlen(words[i]) + 1);
if (copy[i])
strcpy(copy[i], words[i]);
}
// Print and free
for (size_t i = 0; i < num_words; i++) {
printf("%s\n", copy[i]);
free(copy[i]);
}
free(copy);
return 0;
}
C-standardikirjaston käytön edut
- Portability:[] Koodi, joka on kirjoitettu standardikirjastoa vastaan, kokoaa ja toimii millä tahansa sopivalla alustalla (Windows, Linux, MacOS, sulautettu järjestelmä).
- Korrettavuus:[ Kirjastotoiminnot ovat tarkasti testattuja ja käsittelevät reunakoteloita (kuten nollaosoittimia, tyhjiä merkkijonoja ja ylivuotoja) parempia kuin monet käsin valssatut sovellukset.
- Suorituskyky:[ Vakiokirjaston toteutus on usein optimoitu kohdelaitteiston, käyttäen tekniikoita kuten inlining, hakupöydät, ja laitteisto-ohjeet.
- Luettavuuden:[] Käyttämällä pikemminkin kuin mukautetun kuplan lajittelemalla välittömästi kommunikoi muiden kehittäjien kanssa.
- Kestävyys:[ Kirjastot kehittyvät standardin kanssa. Käännäjän tai alustan päivittäminen voi automaattisesti parantaa kirjaston toimintoa koskematta koodiasi.
Parhaat käytännöt ja yhteiset onnettomuudet
Tarkista aina paluuarvot
, ja voivat epäonnistua. Niiden palautusarvojen huomiotta jättäminen johtaa kaatumisiin tai määrittelemättömään käyttäytymiseen. Esimerkiksi:
FILE *fp = fopen("nonexistent.txt", "r");
if (!fp) {
perror("fopen");
return EXIT_FAILURE;
}
Suositut funktiot
ja ovat vaarallisia, koska ne eivät tarkista puskurien kokoa. Käytä , tai (jos saatavilla) puskurin ylivirtojen estämiseksi. Esimerkki:
char buf[10];
snprintf(buf, sizeof(buf), "%s", "Hello, World!"); // safely truncated
Vapaa Kaikki Dynaamisen Allocated Memory
Jokaisen tai on oltava vastaava . Käytä työkaluja kuten Valgrind tai OsoiteSanitizer havaitakseen muistivuodot.
Varokaa Reentrancya.
Jotkut vakiokirjastotoiminnot (esim. ], ]) käyttävät sisäistä staattista tilaa eivätkä ole kierresuojattuja. Monisäikeisissä ohjelmissa suositaan reentrantteja, kuten tai , jos saatavilla.
Muut resurssit
Jotta ymmärtäisit paremmin C-standardikirjastoa, tutustu arvovaltaisiin viitetietoihin:
- cppreference.com ... C standardikirjaston otsikot
- GNU C Kirjaston viiteohje
- POSIX-ohjelmoija ohjekirja (sisältää C-standardin mukaiset kirjastotoiminnot)
Päätelmä
C Standard Library on välttämätön työkalu jokaiselle C-ohjelmoijalle. Otsake- ja toiminto-ohjaamalla voit kirjoittaa lyhyempiä, turvallisempia ja enemmän kannettavia koodia. Peruskomponenttien uudelleen keksimisen sijaan voit keskittyä logiikkaan, joka tekee sovelluksestasi ainutlaatuisen. Kun jatkat kehittämistä C:ssä, tee tapa tarkistaa ensin, onko standardikirjasto jo ratkaisee ongelmasi, se yleensä ratkaisee, ja se tekee niin vuosikymmenien kollektiivisen viisauden paistamana.