strtok ve Belirteçlere Ayırma
Dizgeleri ayırın
strtok ve Belirteçlere Ayırma, CoddyKit'te ücretsiz bir C Academy dersidir. Bu, 4 dersinin 3. 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.
Belirteçlere ayırma nedir
Belirteçlere ayırma, bir dizeyi ayırıcı karakterlerle birbirinden ayrılmış daha küçük parçalara (belirteçlere) bölmek anlamına gelir.
Örneğin "a,b,c" ifadesini virgüllerden bölmek, a, b ve c belirteçlerini verir. C bunun için strtok işlevini sunar.
#include <stdio.h>
#include <string.h>
int main(void) {
char text[] = "a,b,c";
char *token = strtok(text, ",");
printf("First token: %s\n", token);
return 0;
}strtok imzası
char *strtok(char *str, const char *delim);
İlk çağrıda dizeyi geçirirsiniz. Sonraki çağrılarda, kaldığı yerden devam etmesi için NULL geçirirsiniz. İşlev, sonraki belirteci veya işlem tamamlandığında NULL döndürür.
#include <stdio.h>
#include <string.h>
int main(void) {
char text[] = "red green blue";
char *tok = strtok(text, " ");
while (tok != NULL) {
printf("%s\n", tok);
tok = strtok(NULL, " ");
}
return 0;
}strtok dizeyi değiştirir
Önemli: strtok, özgün dizeyi değiştirir. Her ayırıcıyı '\0' ile değiştirir ve aynı arabellek içindeki konumları gösteren işaretçiler döndürür.
Bu nedenle salt okunur olan "a,b" gibi bir dize sabitini belirteçlere ayıramazsınız.
#include <stdio.h>
#include <string.h>
int main(void) {
char data[] = "x:y:z";
strtok(data, ":");
printf("data[1] is now: %d (the null byte)\n", data[1]);
return 0;
}Yazılabilir bir kopya oluşturma
strtok girdisini yok ettiği için özgün dizeye daha sonra ihtiyacınız varsa önce bir kopyasını oluşturun.
Yerel bir char dizisi kullanın veya strcpy ile bir arabelleğe kopyalayın.
#include <stdio.h>
#include <string.h>
int main(void) {
const char *original = "one-two-three";
char copy[64];
strcpy(copy, original);
char *tok = strtok(copy, "-");
while (tok) {
printf("%s\n", tok);
tok = strtok(NULL, "-");
}
printf("Original intact: %s\n", original);
return 0;
}Birden çok ayırıcı
delim bağımsız değişkeni bir karakter dizisi değil, bir kümedir. Kümedeki herhangi bir karakter ayırıcı görevi görür.
Bu nedenle " ,;" ifadesi boşluklara, virgüllere ve noktalı virgüllere aynı anda göre böler.
#include <stdio.h>
#include <string.h>
int main(void) {
char text[] = "a,b;c d";
char *tok = strtok(text, ",; ");
while (tok) {
printf("[%s]\n", tok);
tok = strtok(NULL, ",; ");
}
return 0;
}Ardışık ayırıcılar
strtok, ayırıcı dizilerini tek bir ayırıcı olarak ele alır ve boş belirteçleri atlar.
Bu nedenle "a,,b" yalnızca a ve b değerlerini üretir; arada boş bir belirteç üretmez. Boş alanların önemli olduğu CSV ayrıştırmasında bunu göz önünde bulundurun.
#include <stdio.h>
#include <string.h>
int main(void) {
char text[] = "a,,b";
char *tok = strtok(text, ",");
while (tok) {
printf("token: %s\n", tok);
tok = strtok(NULL, ",");
}
return 0;
}Belirteçleri sayma
Yaygın bir görev, bir dizenin kaç belirteç içerdiğini saymaktır. Döngünün içinde bir sayaç artırın.
#include <stdio.h>
#include <string.h>
int main(void) {
char sentence[] = "the quick brown fox";
int count = 0;
char *tok = strtok(sentence, " ");
while (tok) {
count++;
tok = strtok(NULL, " ");
}
printf("Word count: %d\n", count);
return 0;
}strtok gizli durum tutar
strtok, konumunu bir statik dahili değişkende saklar. NULL değerinin önceki dizeden devam etmesinin nedeni budur.
Dezavantajı, yeniden girişli olmaması ve iş parçacığı açısından güvenli olmamasıdır. Aynı anda iki dizeyi belirteçlere ayıramazsınız.
#include <stdio.h>
#include <string.h>
int main(void) {
char a[] = "1 2";
char *t = strtok(a, " ");
printf("%s\n", t);
t = strtok(NULL, " ");
printf("%s\n", t);
return 0;
}Belirteçleri saklama
Bölme işleminden sonra belirteçleri kullanmak için döndürülen işaretçileri bir dizide saklayın. Bu işaretçiler, artık değiştirilmiş olan kaynak arabelleğinin içini gösterir; arabellek yaşamaya devam etmelidir.
#include <stdio.h>
#include <string.h>
int main(void) {
char csv[] = "name,age,city";
char *fields[10];
int n = 0;
char *tok = strtok(csv, ",");
while (tok && n < 10) {
fields[n++] = tok;
tok = strtok(NULL, ",");
}
for (int i = 0; i < n; i++)
printf("Field %d: %s\n", i, fields[i]);
return 0;
}Yeniden girişli alternatif
POSIX, gizli durum yerine açık bir char **saveptr alan strtok_r işlevini sunar. Bu, işlevi iç içe kullanmayı ve iş parçacıkları arasında çalıştırmayı güvenli hâle getirir.
Taşınabilir standart C için basit, tek geçişli ayrıştırmada strtok yeterlidir.
#include <stdio.h>
#include <string.h>
int main(void) {
char text[] = "p:q:r";
char *save;
char *tok = strtok_r(text, ":", &save);
while (tok) {
printf("%s\n", tok);
tok = strtok_r(NULL, ":", &save);
}
return 0;
}Uygulama: bir yolu parçalara ayırma
Belirteçlere ayırma, dosya yolları gibi yapılandırılmış metinleri ayrıştırırken özellikle kullanışlıdır. / karakterine göre bölmek, yolun her bileşenini ortaya çıkarır.
#include <stdio.h>
#include <string.h>
int main(void) {
char path[] = "usr/local/bin";
char *part = strtok(path, "/");
while (part) {
printf("-> %s\n", part);
part = strtok(NULL, "/");
}
return 0;
}Kısa kontrol
strtok işlevinin nasıl çalıştığı konusundaki anlayışınızı sınayın.
Özet
strtok ile dizeleri parçalara ayırmayı öğrendiniz:
- İlk çağrı dizeyi alır; sonraki çağrılar NULL alır.
- Girdiyi değiştirir ve ayırıcıları
'\0'ile değiştirir; salt okunur dizeleri önce kopyalayın. - Ayırıcı bağımsız değişkeni bir kümedir; ardışık ayırıcılar birleştirilir.
- Statik durum kullanır ve iş parçacığı açısından güvenli değildir; gerektiğinde
strtok_rkullanın.
Sıkça Sorulan Sorular
“strtok ve Belirteçlere Ayırma” dersi ücretsiz mi?
Evet — “strtok ve Belirteçlere Ayırma” 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.
“strtok ve Belirteçlere Ayırma” dersinde ne öğreneceğim?
Dizgeleri ayırın 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 3. dersidir.
“strtok ve Belirteçlere Ayırma” 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
- strlen, strcpy, strcat
- strcmp ve Karşılaştırma
- strtok ve Belirteçlere Ayırma
- memcpy ve memset