Menu

C Standart Kütüphanesi: Bilmeye Değer Başlıkların Haritası

Her standart başlığın size ne verdiği - stdio.h, stdlib.h, string.h, math.h, time.h, ctype.h, limits.h, stdbool.h, stdint.h ve assert.h - her birinin kısa çalışan bir örneğiyle.

Bu sayfada çalıştırılabilir editörler var - düzenle, çalıştır ve sonucu anında gör.

Dil olarak C minicikdir - tipler, operatörler, denetim akışı, fonksiyonlar, göstericiler. Yazdıramaz, dosya okuyamaz, metin karşılaştıramaz ya da bellek tahsis edemez. Bunların hepsi standart kütüphanedir: uyumlu her gerçekleştirimin gönderdiği bir başlık kümesi.

Bu sayfa bir haritadır. Her bölüm bir başlığın ne için olduğunu söyler, kısa çalışan bir örnek gösterir ve varsa daha kapsamlı sayfaya işaret eder.

stdio.h - Girdi ve Çıktı

Hemen her programda ilk dahil ettiğiniz başlık. printf ve scanf'i, FILE tipini ve dosya fonksiyonlarını ve daha güvenli satır yönelimli girdi fonksiyonlarını tutar.

Temel olanlar: çıktı için printf, fprintf, sprintf, snprintf; girdi için scanf, fscanf, sscanf, fgets, getchar; dosyalar için fopen, fclose, fread, fwrite, fseek. Daha derin kapsam printf, scanf ve dosya işlemleri sayfalarındadır.

Taşımaya değer bir kural: asla gets() kullanmayın. Tamponunuzun boyutunu bilmenin yolu yoktur ve C11'de standarttan kaldırıldı. Yerine geçen fgets(buf, sizeof buf, stdin)'dir.

stdlib.h - Genel Yardımcı Araçlar

Her şeyi toplayan: bellek, dönüşümler, rastgelelik, süreç denetimi, sıralama.

Öne çıkanlar: malloc, calloc, realloc, free (bkz. dinamik bellek); dönüşümler için atoi, atof, strtol, strtod - atoi'nin sessizce 0 döndürdüğü yerde başarısızlığı bildirebilen strto* ailesini tercih edin; rand ve srand (bkz. rastgele sayılar); exit, abort, getenv, system; ve qsort/bsearch.

string.h - Metinler ve Bellek Blokları

C metinleri '\0' ile biten char dizileridir ve üzerlerindeki her işlem bir fonksiyon çağrısıdır.

İki alışkanlık bu başlığın bir tampon taşması kaynağı olmasını engeller: hedefin boyutunu her zaman bilin ve strcmp'nin eşitlik için 0 döndürdüğünü unutmayın - if (strcmp(a, b)), metinler farklı olduğunda doğrudur. Metin fonksiyonları, daha güvenli strncpy/snprintf kalıplarını ayrıntılı ele alıyor.

math.h - Matematik

sqrt, pow, fabs, floor, ceil, round, fmod, trigonometri ve logaritma aileleri, INFINITY ve NAN.

Bağlayıcı bayrağı isteyebilecek tek başlık budur: Linux'ta derleme komutunun sonuna -lm ekleyin, yoksa bağlayıcı "undefined reference to sqrt" bildirir. Tam tur matematik fonksiyonları sayfasında.

time.h - Saatler ve Tarihler

struct tm'deki iki kaydırma herkesi yakalar: tm_year 1900'den sayar ve tm_mon 0 tabanlıdır. time(NULL) ayrıca srand için alışıldık tohumdur.

ctype.h - Karakter Sınıflandırma

Küçük ve göründüğünden daha yararlı. Her fonksiyon bir karakter alır ve bir evet/hayır sorusunu yanıtlar ya da büyük-küçük harf dönüştürür.

Tam küme: isalpha, isdigit, isalnum, isspace, isupper, islower, ispunct, isxdigit, isprint, artı toupper ve tolower.

(unsigned char) dönüşümüne dikkat edin. Bu fonksiyonlar, unsigned char olarak gösterilebilen değerler artı EOF için tanımlıdır; düz bir char çoğu sistemde işaretlidir, dolayısıyla 127'nin üzerindeki bir bayt negatif bir sayı olarak gelir ve çağrı tanımsız davranışa dönüşür. Dönüşüm hiçbir şeye mal olmaz ve tüm sorun sınıfını ortadan kaldırır.

Ve bunları elle yazılmış testlere tercih edin. c >= '0' && c <= '9' tesadüfen çalışır, ama isdigit(c) ne kastettiğinizi söyler ve her yerde doğru kalır.

limits.h ve float.h - Tiplerin Sınırları

Bu makinede bir int ne kadar büyük olabilir? Bu başlıklar bunu yanıtlar ve cevaplar, taşınabilir kodun varsaymak yerine sormasının sebebidir.

INT_MAX, taşmayı olmadan önce denetleme yolunuzdur; bu önemlidir, çünkü işaretli taşma sonradan test edebileceğiniz bir sarma değil tanımsız davranıştır.

stdbool.h ve stdint.h - Daha İyi Tipler

C'nin C99'a kadar boolean türü yoktu. <stdbool.h> bir tane sağlar:

bool, true ve false; _Bool, 1 ve 0 için makrolardır, ama niyeti apaçık kılarlar. (C23'te anahtar kelime oldular ve başlık artık gerekli değil.)

<stdint.h>, garantili genişliklere sahip tipler verir - "bir int muhtemelen 32 bittir"in yeterli olmadığı dosya biçimleri, ağ protokolleri ve gömülü her şey için şarttır:

<inttypes.h>'deki PRId32 tarzı makrolar, her sabit genişlikli tip için mevcut platformda doğru printf belirtecine genişler - onları yazdırmanın taşınabilir yolu budur, çünkü %d, bazı sistemlerde int32_t için doğru, bazılarında yanlıştır.

assert.h - Varsayımlarınızı Denetlemek

assert(ifade), ifade doğruyken hiçbir şey yapmaz ve yanlışken programı bir mesajla durdurur.

-DNDEBUG ile derlemek her doğrulamayı kaldırır, dolayısıyla bir yayın derlemesinde hiçbir maliyetleri yoktur. Uyarı da budur: bir assert'in içine asla yan etki koymayın. assert(read_next() > 0), yayın derlemesinde okumayı tamamen durdurur ve ortaya çıkan hata yalnızca üretimde görünür.

Doğrulamalar sizin hatalarınız içindir - kod doğruysa imkânsız olması gereken koşullar. Kötü kullanıcı girdisi bir doğrulama değildir; bir if ve bir hata mesajıdır.

Kısaca Geri Kalanı

  • <stddef.h> - size_t, ptrdiff_t, NULL, offsetof
  • <stdarg.h> - değişken argümanlı fonksiyonlar, printf'in arkasındaki mekanizma
  • <errno.h> - errno artı bir çağrının neden başarısız olduğunu bildirmek için perror ve strerror
  • <signal.h> - Ctrl-C gibi sinyalleri ele almak
  • <setjmp.h> - yerel olmayan atlamalar; nadiren doğru cevaptır
  • <locale.h>, <wchar.h>, <wctype.h> - yerel ayarlar ve geniş karakterler
  • <stdnoreturn.h>, <stdalign.h>, <threads.h>, <stdatomic.h> - C11 eklemeleri

İki alışkanlık kütüphaneyi kullanmayı keyifli kılar. Bir imzayı tahmin etmeden önce kılavuz sayfasını okuyun - macOS ve Linux'ta man 3 strtol yetkili ve hızlıdır. Ve dönüş değerlerini denetleyin: malloc, fopen ve strtol hepsi başarısızlığı bildirir ve onları yok sayan bir program çok daha sonra ve çok daha az anlaşılır biçimde başarısız olur.

Sıkça Sorulan Sorular

C standart kütüphanesi nedir?

Uyumlu her C gerçekleştiriminin sağladığı, yaklaşık 30 başlığa gruplanmış fonksiyon, tür ve makro kümesidir. Girdi ve çıktıyı (<stdio.h>), belleği ve dönüşümleri (<stdlib.h>), metinleri (<string.h>), matematiği (<math.h>), zamanı, karakter sınıflandırmayı ve sayısal tiplerin sınırlarını kapsar. C'nin yerleşik G/Ç'si ya da metin işlemesi yoktur - hepsi buradan gelir.

stdio.h ile stdlib.h arasındaki fark nedir?

<stdio.h> girdi ve çıktıdır: printf, scanf, fopen, fgets, FILE. <stdlib.h> genel yardımcı araçlardır: malloc ve free, atoi ve strtol, rand ve srand, exit, qsort, bsearch. Tipik bir program ikisini de dahil eder.

ctype.h ne yapar?

Tek karakterleri sınıflandırır ve dönüştürür: isdigit, isalpha, isalnum, isspace, isupper, islower, ispunct, artı toupper ve tolower. Onları c >= '0' && c <= '9' gibi elle yazılmış karşılaştırmalar yerine kullanmak daha anlaşılırdır ve her yerel ayar ve karakter kümesi için doğrudur.

C standart kütüphanesini kullanmak için bir şey bağlamam gerekir mi?

Hayır, bir istisnayla: matematik fonksiyonları. Standart C kütüphanesi otomatik bağlanır, ama Linux'ta <math.h>'nin gerçekleştirimleri ayrı bir kütüphanede yaşar, dolayısıyla sqrt ve arkadaşları derleme komutunun sonunda -lm ister. Diğer her şey yalnızca doğru #include'u ister.

Coddy programming languages illustration

Coddy ile kodlamayı öğren

BAŞLA