Yaygın G/Ç Tuzakları
Tampon ve satır sonu sorunları
Yaygın G/Ç Tuzakları, CoddyKit'te ücretsiz bir C Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C Academy kursu toplamda 4 dersten oluşur.
Yaygın Girdi/Çıktı Hataları
C dilinde girdi ve çıktı, birkaç klasik tuzak içerir. Bunları bilmek hata ayıklama için harcanan saatleri azaltır.
#include <stdio.h>
int main(void) {
printf("Let us study I/O pitfalls\n");
return 0;
}Artakalan Yeni Satır
scanf("%d", ...) sonrasında Enter tuşu arabellekte bir \n bırakır. Daha sonra kullanılan %c, gerçek girdi yerine bu yeni satırı okur.
#include <stdio.h>
int main(void) {
char c = 'A';
printf("Use a space before %%c to skip the leftover newline\n");
printf("c = %c\n", c);
return 0;
}Boşlukla Düzeltme
Başında boşluk bulunan scanf(" %c", &c) yazmak, scanf işlevine önce boşluk karakterlerini atlamasını söyler.
#include <stdio.h>
int main(void) {
char c = 'Z';
printf("scanf(\" %%c\", &c) skips whitespace\n");
printf("c = %c\n", c);
return 0;
}Ampersandı Unutma
Bir değişkeni & olmadan scanf işlevine geçirmek, yanlış bir adrese yazılmasına ve büyük olasılıkla programın çökmesine neden olur.
#include <stdio.h>
int main(void) {
int n = 9;
printf("Always pass &n, not n, to scanf for an int\n");
printf("n = %d\n", n);
return 0;
}Uyuşmayan Belirteçler
scanf içinde bir double değeri %lf yerine %f ile okumak, değeri bozar. Çıktı için her ikisinde de %f kullanılır, ancak girdi farklıdır.
#include <stdio.h>
int main(void) {
double d = 2.5;
printf("scanf needs %%lf for double; printf uses %%f\n");
printf("d = %.1f\n", d);
return 0;
}Çıktı Arabelleğe Alma
Çıktı arabelleğe alınabilir ve hemen görünmeyebilir. \n ile bitirmek veya fflush(stdout) çağrısını yapmak arabelleği boşaltır.
#include <stdio.h>
int main(void) {
printf("Flushed by newline\n");
fflush(stdout);
return 0;
}gets Tehlikelidir
Eski gets işlevi sınır denetimi yapmıyordu ve modern C dilinden kaldırılmıştır. Bunun yerine fgets kullanınız.
#include <stdio.h>
int main(void) {
char buf[10];
/* fgets(buf, sizeof buf, stdin); */
buf[0] = 'H'; buf[1] = 'i'; buf[2] = 0;
printf("buf = %s\n", buf);
return 0;
}%s ile Arabellek Taşması
scanf içinde tek başına kullanılan %s, küçük bir dizinin sonuna kadar yazabilir. %19s gibi bir genişlikle sınırlandırınız.
#include <stdio.h>
int main(void) {
char name[20];
printf("Use %%19s to leave room for the null terminator\n");
name[0] = 0;
printf("name length cap protects buffer\n");
return 0;
}fgets Yeni Satırı Korur
fgets, sondaki yeni satırı depolar. Çoğu zaman bunu kaldırmanız gerekir.
#include <stdio.h>
#include <string.h>
int main(void) {
char line[] = "hello\n";
line[strcspn(line, "\n")] = 0;
printf("[%s]\n", line);
return 0;
}Dönüş Değerlerini Yok Sayma
scanf dönüş değerini denetlememek, hatalı girdinin sessizce kabul edilmesine neden olur. Her zaman denetleyiniz.
#include <stdio.h>
int main(void) {
int n = 3;
int items = 1;
if (items != 1)
printf("bad input\n");
else
printf("ok: %d\n", n);
return 0;
}Hepsini Güvenli Biçimde Bir Araya Getirme
Sağlam bir yaklaşım şöyledir: fgets ile okuyunuz, sscanf ile ayrıştırınız ve sonucu denetleyiniz.
#include <stdio.h>
int main(void) {
char line[] = "123";
int n;
if (sscanf(line, "%d", &n) == 1)
printf("parsed %d\n", n);
return 0;
}Hızlı Kontrol
Girdi/çıktı tuzakları konusundaki anlayışınızı sınayınız.
Özet: Yaygın Girdi/Çıktı Tuzakları
Yaygın hatalardan kaçınmayı öğrendiniz.
- Artakalan yeni satırlar
%cifadesinin yanlış okuma yapmasına neden olur; başına boşluk ekleyiniz - Adresleri her zaman
&ile geçiriniz - double değerleri okumak için
%lfkullanınız getsyerinefgetskullanmayı ve%sgenişliğini sınırlandırmayı tercih ediniz- Dönüş değerlerini denetleyiniz ve çıktıyı arabellekten boşaltınız
Sıkça Sorulan Sorular
“Yaygın G/Ç Tuzakları” dersi ücretsiz mi?
Evet — “Yaygın G/Ç Tuzakları” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C Academy kursu toplamda 4 dersten oluşur.
“Yaygın G/Ç Tuzakları” dersinde ne öğreneceğim?
Tampon ve satır sonu sorunları C Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
C Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te C Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.
“Yaygın G/Ç Tuzakları” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu C Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her C Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- printf Biçim Belirteçleri
- scanf ve Girdi
- Genişlik, Kesinlik, Bayraklar
- Yaygın G/Ç Tuzakları