Strtok c açıklaması. C dilinin işlevlerinin açıklaması. Örnek: program kaynak kodu

  • 03.11.2019

char uzak * uzak _fstrtok (const char uzak * str1, const char uzak * str2)

Açıklama:

strtok () işlevi, str1 ile gösterilen dizedeki bir sonraki simgeye bir işaretçi döndürür. str2 ile gösterilen dizgedeki karakterler, belirteci tanımlamak için sınırlayıcı olarak kullanılır. Belirteç bulunamazsa, NULL döndürülür.

strtok() işlevine yapılan ilk çağrı, aslında bir işaretçi olarak str1'i kullanır. Sonraki çağrılar, ilk bağımsız değişken olarak NULL kullanır. Bu şekilde tüm hat belirtilebilir.

strtok () işlevinin str1 ile gösterilen dizeyi değiştirdiğini anlamak önemlidir. Bir belirteç bulunduğunda, sınırlayıcının bulunduğu yere boş bir karakter yerleştirilir. Bu şekilde strtok () satır boyunca ilerletilir.

strtok() öğesini her aradığınızda, sınırlayıcı kümesini değiştirebilirsiniz.

_fstrtok() işlevi, söz konusu işlevin FAR sürümüdür.

Aşağıdaki program, "Yaz askeri, güneş ışığı vatansever" dizesini, sınırlayıcı olarak boşluk ve virgül kullanarak belirteçlere ayırır. Program işleminin bir sonucu olarak, aşağıdaki formun bir satırı oluşturulacaktır: “The | yaz | asker | | güneş | vatansever ".
#Dahil etmek
#Dahil etmek
int ana (boş)
{
karakter * p;
p = strtok ( "Yaz askeri, güneş vatansever", " " ) ;
printf(p);
yapmak (
p = strtok (" \0 " , ", " ) ;
if (p) printf ("|% s", p);
) iken (p);
0 döndür;
}

#Dahil etmek karakter * strtok (karakter * str1, sabit karakter * str2);

strtok () işlevi, parametre tarafından işaret edilen dizedeki bir sonraki simgeye bir işaretçi döndürür. str1... Parametre tarafından adreslenen dizeyi oluşturan karakterler str2, bir belirteç tanımlayan sınırlayıcılardır. Döndürülecek bir belirteç yoksa, bir boş gösterici döndürülür.

C99 sürümünde parametrelere str1 ve str2 kısıtlayıcı niteleyici uygulandı.

Bazı dizeleri belirteçlere bölmek için, strtok () işlevi ilk kez çağrıldığında, parametre str1 bu satırın başlangıcını göstermelidir. Parametre olarak işleve yapılan sonraki çağrılarda str1 boş gösterici kullanmanız gerekir. Bu şekilde, tüm çizgi jetonlara bölünür.

strtok() işlevi her çağrıldığında, farklı bir sınırlayıcı kümesi kullanılabilir.

Örnek

Bu program, "Çim yeşil, güneş parlıyor" satırını, boşluklar ve virgüllerle ayrılmış belirteçlere böler. Sonuç olacak

Ot | yeşil | güneş | pırıltılar #include #Dahil etmek int main (void) (char * p; p = strtok ("Çim yeşil, güneş parlıyor", ""); printf (p); do (p = strtok ("\ 0", ",") ; if (p ) printf ("|% s", p);) while (p); 0 döndür;)

strtok () işlevi, str1 ile gösterilen dizedeki bir sonraki simgeye bir işaretçi döndürür. str2 ile gösterilen dizeyi oluşturan karakterler, belirteci tanımlayan sınırlayıcılardır. Döndürülecek bir belirteç yoksa, bir boş gösterici döndürülür.

C99'da, kısıtlama niteleyicisi str1 ve str2 parametrelerine uygulanır.

Bir dizgeyi belirteçlere bölmek için, strtok() işlevi ilk kez çağrıldığında, str1 parametresi bu dizgenin başlangıcını göstermelidir. İşleve yapılan sonraki çağrılarda, str1 parametresi olarak bir boş gösterici kullanılmalıdır. Bu durumda, fonksiyon her çağrıldığında satırın tamamı güncellenecektir.

strtok() işlevi her çağrıldığında, farklı bir belirteç ayırıcı kümesi kullanılabilir.

strtok () işlevi, bir dizeyi oluşturan parçalarına kısaltmak için bir olanak sağlar. Örneğin, aşağıdaki program "Bir, iki ve üç" dizesini belirtecektir.

#Dahil etmek #Dahil etmek int ana (boşluk) karakter * p; p = strtok ("Bir, iki ve üç.", ","); printf(p); do (p = strtok (NULL, ",."); if (p) printf ("|% s", p);) while (p), 0 döndür; )

Bu programın sonucu aşağıdaki gibidir.

Bir | iki | ve | üç

strtok () işlevinin ilk olarak orijinal dizeyle nasıl çağrıldığına dikkat edin, ancak sonraki çağrılar ilk argüman olarak NULL'u kullanır. strtok () işlevi, işlenmekte olan dizeye bir dahili işaretçi tutar. strtok () işlevinin ilk argümanı bir dizgeyi gösteriyorsa, dahili işaretçi o dizgenin başlangıcına ayarlanır. İlk bağımsız değişken NULL ise, strtok () işlevi önceki adımda depolanan konumdan başlayarak önceki dizeyi işlemeye devam eder ve sonraki simge alındığında dahili işaretçiyi ilerletir. Böylece, strtok () işlevi tüm dizeyi "geçer". Ayrıca, işleve yapılan ilk ve sonraki çağrılarda sınırlayıcı dizenin nasıl değiştiğine dikkat edin. Sınırlayıcılar, her çağrıda farklı şekilde tanımlanabilir.

4 cevap

strtok hakkında bilinmesi gereken iki şey var. Belirtildiği gibi, "bir iç durumu korur". Ayrıca, o beslediğin çizgiyi bozdu... Esasen, sağladığınız işaretçiyi bulacağı yere "\ 0" yazacak ve satırın başına bir işaretçi döndürecektir. Dahili olarak, son jetonun konumunu korur; ve bir dahaki sefer aradığınızda, oradan başlayacaktır.

Bunun önemli bir sonucu, const char * "merhaba dünya" üzerinde strtok kullanamazsınız; çünkü const char * dizesinin içeriğini değiştirdiğinizde erişim ihlali alırsınız.

strtok ile ilgili "iyi şey", aslında dizeleri kopyalamamasıdır, bu nedenle ek bellek ayırmaları vb. yönetmeniz gerekmez. Ancak yukarıdakileri anlamadıysanız, onu kullanmakta sorun yaşarsınız.

Örnek. "This, is, a string" varsa, strtok'a yapılan ardışık çağrılar bunun gibi işaretçiler üretecektir (^ değeri dönüş değeridir). Belirteçlerin bulunduğu yere "\ 0" eklendiğini unutmayın; bu, orijinal satırın değiştirildiği anlamına gelir:

T his, is, a, string \ 0 this, is, a, string this \ 0 is, a, string \ 0 this ^ this \ 0 is \ 0 a, string \ 0 is ^ this \ 0 is \ 0 a \ 0 string \ 0 a ^ bu \ 0 is \ 0 a \ 0 string \ 0 string ^

Umarım bu mantıklıdır.

strtok () işlevi, çağrılar arasında veri depolar. NULL işaretçisi ile çağırdığınızda bu verileri kullanır.

Son belirtecin bulunduğu nokta, bir sonraki çağrıda kullanılacak bir işlevle dahili olarak depolanır (veri hatalarını önlemek için kitaplığa özel bir uygulama gerekmez).

strtok dahili durumu korur. NULL olmayan ile çağırdığınızda, sağladığınız dizeyi kullanmak için kendini yeniden başlatır. NULL ile çağırdığınızda, bir sonraki belirteci döndürmek için o dizeyi ve şu anda aldığı diğer durumu kullanır.

strtok'un çalışma şekli nedeniyle, çok iş parçacıklı bir uygulama yazıyorsanız, C çalışma zamanının çok iş parçacıklı bir sürümüne bağlandığınızdan emin olmanız gerekir. Bu, her iş parçacığının strtok için kendi iç durumunu almasını sağlar.

strtok işlevi, verileri tüm iş parçacıkları arasında paylaşılan dahili bir statik değişkende depolar.

İş parçacığı güvenliği için strtok_r kullanmanız gerekir

static char * last'a bir göz atın;

Char * strtok (s, delim) register char * s; register const char * deli; (char * spanp kaydedin; int c, sc; char * tok; static char * son; if (s == NULL && (s = last) == NULL) return (NULL); / * * Başa atlama (yayılma) sınırlayıcılar (s + = strspn (s, delim), tür). * / cont: c = * s ++; for (spanp = (char *) delim; (sc = * spanp ++)! = 0;) (if (c == sc) goto cont;) if (c == 0) (/ * sınırlayıcı olmayan karakter yok * / last = NULL; return (NULL);) tok = s - 1; / * * Tarama belirteci (sınırlayıcıları tara: s + = strcspn (s, delim), tür. * Sınırlamanın bir NUL olması gerektiğini unutmayın, onu da görürsek dururuz. * / for (;;) (c = * s + +; spanp = (char *) delim; do (if ((sc = * spanp ++) == c) (if (c == 0) s = NULL; başka s [-1] = 0; son = s ; dönüş (tok);)) while (sc! = 0);) / * ULAŞILMADI * /)