Scanf C işlevi açıklaması
Scanf C işlevi açıklaması

Video: Scanf C işlevi açıklaması

Video: Scanf C işlevi açıklaması
Video: Ayasofya hatıra parasını 1000 tl den alırım diyor !! #ayasofyacami #coins #bizans #roma #koleksiyon 2024, Mayıs
Anonim

Bu makalede, scanf() işlevi belirli bir standarda atıfta bulunulmadan genel bir biçimde ele alınmaktadır, bu nedenle herhangi bir C99, C11, C++11, C++14 standardından gelen veriler buraya dahil edilmiştir. Belki bazı standartlarda işlev, makalede sunulan malzemeden farklılıklarla çalışır.

scanf C işlevi - açıklama

scanf(), biçimlendirilmiş program girişi olarak da bilinen stdio.h(C) ve cstdio(C++) başlık dosyalarında bulunan bir işlevdir. scanf, standart giriş akışından (stdin) karakterleri okur ve bunları biçime göre dönüştürür, ardından belirtilen değişkenlere yazar. Biçim - verilerin alındıktan sonra belirli bir forma dönüştürüldüğü anlamına gelir. Böylece scanf C işlevi açıklanmıştır:

scanf("%format", &variable1[, &variable2, […]), değişkenlerin adres olarak geçirildiği yer. Değişkenleri bir fonksiyona bu şekilde geçirmenin nedeni açıktır: işin sonucu olarak, hataların varlığını gösteren bir değer döndürür, bu nedenledeğişkenlerin değerlerini değiştirmenin tek yolu adresten geçmektir. Ayrıca bu yöntem sayesinde fonksiyon her türden veriyi işleyebilir.

Bazı programcılar, diğer dillerle benzerlikleri nedeniyle scanf() veya printf() gibi işlevlere prosedür olarak atıfta bulunur.

Scanf, tüm temel dil türlerinin girişine izin verir: char, int, float, string, vb. string türündeki değişkenler söz konusu olduğunda, string türündeki değişken bir dizi olduğundan ve adı bilgisayarın belleğindeki dizinin ilk öğesinin adresi olduğundan, adres işaretini - "&" belirtmeye gerek yoktur..

C++'da C Kullanımı
C++'da C Kullanımı

Veri giriş formatı veya kontrol dizisi

Açıklamadan scanf C işlevi örneğine bakarak başlayın.


include int ana() { int x; while (scanf("%d", &x)==1) printf("%d\n", x); 0 döndür; //linux sistemleri için gereksinim }

Giriş biçimi şu dört parametreden oluşur: %[genişlik][değiştiriciler] tür. Bu durumda, "%" işareti ve tür zorunlu parametrelerdir. Yani, minimum biçim şöyle görünür: “%s”, “%d” vb.

Genel olarak, biçim dizesini oluşturan karakterler şu şekilde ayrılır:

  • format belirteçleri - % ile başlayan her şey;
  • ayırma veya boşluk karakterleri - bunlar boşluk, sekme(t), yeni satır (n);
  • boşluk dışındaki karakterler.

İşlev güvenli olmayabilir.

scanf() yerine scanf_s() kullanın.

(Visual Studio'dan mesaj)

Tür veya biçim belirteçleri veya dönüştürme karakterleri veya kontrol karakterleri

ikili kod
ikili kod

A scanf C bildirimi, "%" ile başlayan ifadelerin sonunda belirtilen en az bir biçim belirteci içermelidir. Programa, genellikle klavyeden girerken beklenecek veri türünü söyler. Aşağıdaki tabloda tüm biçim belirteçlerinin listesi.

Tür Anlam
1 %c Program bir karakter girişi bekliyor. Yazılacak değişken char. karakter tipinde olmalıdır.
2 %d Program, tamsayı türünde ondalık bir sayının girilmesini bekler. Değişken int türünde olmalıdır.
3 %i Program, tamsayı türünde ondalık bir sayının girilmesini bekler. Değişken int türünde olmalıdır.
4 %e, %E Program, üstel biçimde bir kayan noktalı (virgül) sayı girmeyi bekler. Değişken float türünde olmalıdır.
5 %f Program bir kayan noktalı sayı (virgül) bekler. Değişken float türünde olmalıdır.
6 %g, %G Program bir kayan noktalı sayı (virgül) bekler. Değişken float türünde olmalıdır.
7 %a Program bir kayan noktalı sayı (virgül) bekler. Değişken float türünde olmalıdır.
8 %o Program sekizlik bir sayı bekliyor. Değişken int türünde olmalıdır.
9 %s Program girilecek bir diziyi bekliyor. Bir dize, karşılaşılan ilk ayırıcı karaktere kadar herhangi bir karakter kümesidir. Değişken string türünde olmalıdır.

10

%x, %X Program on altılık bir sayı bekliyor. Değişken int türünde olmalıdır.
11 %p Değişken, işaretçi girişi bekliyor. Değişken işaretçi türünde olmalıdır.
12 %n Scanf işlevi tarafından o ana kadar okunan karakter sayısına eşit bir tamsayı değeri bir değişkene yazar.
13 %u Program işaretsiz bir tamsayı okur. Değişken türü işaretsiz tamsayı olmalıdır.
14 %b Program bir ikili sayı bekliyor. Değişken int türünde olmalıdır.
15 % Taranmış karakter seti. Program karakterlerin girilmesini bekliyor.köşeli parantezler arasında belirtilen sınırlı havuzdan. scanf, giriş akışında belirtilen kümeden karakterler olduğu sürece çalışacaktır.
16 %% "%"işaretleyin.

Biçim dizesindeki karakterler

C++ kodu
C++ kodu

Yıldız sembolü ()

Yıldız (), atama işleminin gizlenmesi gerektiğini belirten bir bayraktır. "%" işaretinden hemen sonra bir yıldız işareti konur. Örneğin,


scanf("%d%c%d", &x, &y); //iki tamsayı arasındaki karakteri yoksay. scanf("%s%d%s", str, str2); //iki dize arasındaki tamsayıyı yoksay.

Yani konsolda "45-20" satırını girerseniz program şunları yapacaktır:

  1. "x" değişkenine 45 değeri atanacak.
  2. "y" değişkenine 20 değeri atanacak.
  3. Ve eksi işareti (tire) "-", "%c" sayesinde yok sayılır.

Genişlik (veya alan genişliği)

Bu, "%" işareti ile geçerli okuma işleminde okunacak maksimum karakter sayısını belirten biçim belirteci arasında bir tamsayıdır.


scanf("%20s", str); //giriş akışındaki ilk 20 karakteri oku

Akılda tutulması gereken birkaç önemli şey var:

  1. scanf, 20 karakter saymasa bile bir ayırıcı karakterle karşılaşırsa sonlandırılır.
  2. 20'den fazla karakter girilirse, str'ye yalnızca ilk 20 karakter yazılacaktır.

Değiştiricileryazın (veya kesinlik)

sıçrama kodu
sıçrama kodu

Bunlar, giriş için beklenen veri türünü değiştiren özel işaretlerdir. Bayrak, tür belirtecinin solunda belirtilir:

  • L veya l (küçük L) d, i, o, u, x belirteçleriyle "l" kullanıldığında, bayrak programa uzun int girişinin beklendiğini söyler. e veya f belirteci ile "l" kullanıldığında, bayrak programa bir çift değer beklemesi gerektiğini söyler. "L"nin kullanılması, programa uzun bir çiftin beklendiğini söyler. "c" ve "s" belirteçleriyle "l"nin kullanılması, programa wchar_t gibi iki baytlık karakterlerin beklendiğini söyler. Örneğin, "%lc", "%ls", "%l[asd]".
  • h, kısa türü belirten bir bayraktır.
  • hh - değişkenin, işaretli bir karakter veya işaretsiz bir karakter değerine işaretçi olduğunu gösterir. Bayrak, d, i, o, u, x, n belirteçleriyle kullanılabilir.
  • ll (iki küçük L) - değişkenin, işaretli uzun uzun int veya işaretsiz uzun uzun int türünde bir değere işaretçi olduğunu gösterir. Bayrak, belirteçlerle birlikte kullanılır: d, i, o, u, x, n.
  • j - değişkenin, stdint.h başlık dosyasındaki intmax_t veya uintmax_t türüne yönelik bir işaretçi olduğunu gösterir. Belirticilerle birlikte kullanılır: d, i, o, u, x, n.
  • z - değişkenin, tanımı stddef.h'de olan size_t türünün bir göstergesi olduğunu belirtir. Belirticilerle birlikte kullanılır: d, i, o, u, x, n.
  • t - değişkenin ptrdiff_t türünün bir göstergesi olduğunu gösterir. Tanımbu tür stddef.h'dedir. Belirticilerle birlikte kullanılır: d, i, o, u, x, n.

Daha açık olarak, değiştiricileri olan resim bir tablo olarak gösterilebilir. Programcılar için böyle bir scanf C açıklaması daha net olacaktır.

Tür Belirticiler ve Değiştiriciler
Tür Belirticiler ve Değiştiriciler

Diğer karakterler

Formatta karşılaşılan tüm karakterler silinecektir. Aynı zamanda, kontrol dizesinde boşluk veya ayırıcı karakterlerin (yeni satır, boşluk, sekme) varlığının, işlevin farklı davranışlarına yol açabileceği unutulmamalıdır. Bir sürümde, scanf(), ayırıcı dışında bir karakterle karşılaşana kadar herhangi bir sayıda ayırıcı kaydetmeden okuyacaktır ve başka bir sürümde, boşluklar (yalnızca onlar) bir rol oynamaz ve "%d + %d" ifadesi "% d+%d" ile eşdeğerdir.

C++ kod örneği
C++ kod örneği

Örnekler

İşlevin nasıl çalıştığını daha iyi anlamanıza ve düşünmenize yardımcı olacak bazı örneklere bakalım.


scanf("%3s", str); //konsolda "1d2s3d1;3" dizgisini girerseniz, str scanf("%dminus%d", &x, &y); //iki sayı arasındaki eksi karakterler silinecek scanf("%5[0-9]", str); // 5 karakter olana kadar karakterler str'ye girilecektir ve karakterler 0'dan 9'a kadar sayılardır scanf("%lf", &d); //çift girdi bekliyoruz scanf("%hd", &x); //beklenen tür sayısı kısa scanf("%hu", &y); // işaretsiz sayı bekle kısa scanf("lx", &z); //beklenen türde long int

KimdenAşağıdaki örnekler, farklı semboller kullanarak beklenen sayının nasıl değiştiğini göstermektedir.

scanf C - yeni başlayanlar için açıklama

Bu bölüm yeni başlayanlar için faydalı olacaktır. Genellikle, işlevin nasıl çalıştığına ilişkin ayrıntılar olarak scanf C'nin tam bir açıklamasına sahip olmanız gerekmez.

  • Bu özellik biraz eskidir. Farklı sürümlerin kitaplıklarında birkaç farklı uygulama vardır. Örneğin, açıklaması microsoft web sitesinde bulunabilen geliştirilmiş scanf SC işlevi.
  • Biçimdeki belirteçlerin sayısı, işleve iletilen bağımsız değişkenlerin sayısıyla eşleşmelidir.
  • Giriş akışı öğeleri yalnızca ayırıcı karakterlerle ayrılmalıdır: boşluk, sekme, yeni satır. Virgül, noktalı virgül, nokta vb. - bu karakterler scanf() işlevi için ayırıcı değildir.
  • scanf bir ayırıcı karakterle karşılaşırsa giriş durdurulur. Okunacak birden fazla değişken varsa, scanf sonraki değişkeni okumaya geçer.
  • Giriş veri formatındaki en ufak bir tutarsızlık, programın öngörülemeyen sonuçlarına yol açar. Peki, program bir hata ile biterse. Ancak çoğu zaman program çalışmaya devam eder ve yanlış yapar.
  • scanf("%20s …", …); Giriş akışı 20 karakteri aşarsa, scanf ilk 20 karakteri okuyacak ve eğer belirtilmişse sonraki değişkeni okumaya devam edecek veya iptal edecektir. Bu durumda, bir sonraki scanf çağrısı, önceki scanf çağrısının çalışmasının durduğu noktadan giriş akışını okumaya devam edecektir. İlk 20'yi okurkenkarakter, bir sınırlayıcı karakterle karşılaşılırsa, scanf ilk değişken için 20 karakter okumamış olsa bile sonraki değişkeni iptal eder veya okumaya devam eder. Bu durumda, okunmamış tüm karakterler bir sonraki değişkene eklenecektir.
  • Taranan karakter grubu bir "^" ile başlıyorsa, scanf bir sınırlayıcı karakter veya kümeden bir karakterle karşılaşana kadar verileri okuyacaktır. Örneğin, "%[^A-E1-5]", A'dan E'ye büyük harfli İngilizce karakterlerden biriyle veya 1'den 5'e kadar olan sayılardan biriyle karşılaşılıncaya kadar akıştaki verileri okuyacaktır.
  • Açıklandığı gibi scanf C işlevi, değişkenlere başarılı yazma sayısına eşit bir sayı döndürür. scanf 3 değişken yazarsa, işlevin başarı sonucu 3 sayısını döndürür. scanf herhangi bir değişken yazamazsa, sonuç 0 olur. Ve son olarak, eğer scanf herhangi bir nedenle hiç başlayamazsa, sonuç EOF olacaktır.
  • scanf() işlevi yanlış bir şekilde sona erdiyse. Örneğin, scanf("%d", &x) - bir sayı bekleniyordu, ancak girdi olarak karakterler alındı. Sonraki scanf() çağrısı, giriş akışında önceki işlev çağrısının bittiği noktada başlar. Bu sorunu aşmak için sorunlu karakterlerden kurtulmak gerekir. Bu, örneğin scanf("%s") çağrılarak yapılabilir. Yani fonksiyon bir dizi karakter okuyacak ve onu atacaktır. Bu zorlu yolla gerekli verileri girmeye devam edebilirsiniz.
  • Scanf()'ın bazı uygulamalarında, taranan karakter kümesinde "-" kullanılmasına izin verilmez.
  • "%c" belirteci, akıştaki her karakteri okur. Yani ayırıcı karakteri de okur. Sınırlayıcı karakteri atlamak ve istediğiniz karakteri okumaya devam etmek için "%1s" kullanabilirsiniz.
  • "c" belirteci kullanılırken, "%10c" genişliğinin kullanılmasına izin verilir, ancak daha sonra scanf işlevine değişken olarak char türünde bir dizi öğe iletilmelidir.
  • “%[a-z]”, “İngiliz alfabesinin tüm küçük harfleri” anlamına gelir ve “%[z-a]” yalnızca 3 karakter anlamına gelir: 'z', 'a', '-'. Başka bir deyişle, "-" karakteri, yalnızca doğru sırada olan iki karakter arasındaysa bir aralık anlamına gelir. "-" bir ifadenin sonunda, başında veya her iki yanında yanlış karakterlerdeyse, bu bir aralık değil, yalnızca kısa çizgi karakteridir.
C++ kodu
C++ kodu

Sonuç

Bu, scanf C'nin açıklamasını tamamlar. Bu, küçük programlarda ve prosedürel programlama yöntemini kullanırken çalışmak için güzel ve kullanışlı bir özelliktir. Bununla birlikte, ana dezavantaj, scanf kullanırken meydana gelebilecek öngörülemeyen hataların sayısıdır. Bu nedenle, programlama sırasında scanf C'nin açıklaması en iyi şekilde gözlerinizin önünde tutulur. Büyük profesyonel projelerde, daha üst düzey yeteneklere sahip olmaları, hataları daha iyi yakalayabilmeleri ve ele alabilmeleri ve ayrıca önemli miktarda bilgi ile çalışabilmeleri nedeniyle iostream'ler kullanılır. Ayrıca, Scanf C'nin Rusça açıklamasının birçok ağ kaynağında ve bunun örneklerinde mevcut olduğuna dikkat edilmelidir.işlevin yaşı nedeniyle kullanın. Bu nedenle, gerekirse cevabı her zaman tematik forumlarda bulabilirsiniz.

Önerilen: