logo

Kullanıcı Girişi için dahili kütüphane fonksiyonları | sscanf, scanf_s, fscanf_s, sscanf_s

C Programlama Dili, Kullanıcı Girişi için çeşitli Dahili Kütüphane İşlevleri sağlar. Bu yazıda C'deki sscanf scanf_s fscanf_s sscanf_s Kütüphane Fonksiyonlarını öğreneceğiz.

1. C'de sscanf() Fonksiyonu

sscanf(), dizeden biçimlendirilmiş girişi okumak için kullanılır. Scanf() ve sscanf() fonksiyonlarının her ikisi de benzerdir; aralarındaki tek fark, scanf() fonksiyonunun kullanıcıdan gelen girişi klavye gibi standart girişten okuması ve sscanf() fonksiyonunun bir dizeden girişi okuması ve girişi başka bir dizede saklamasıdır.

Sözdizimi

int   sscanf   ( const char *   str   const char *   format   ...);

Parametreler

    cadde: Veri okumak istediğimiz girdi dizesi.biçim: Tür belirticilerini içeren bir dize.… (üç nokta): Fonksiyonun değişken sayıda argüman kabul ettiğini gösterir.

Dönüş Değeri

  • Başarı durumunda fonksiyon başarıyla okunan değerlerin sayısını döndürür.
  • Herhangi bir veri başarıyla okunmadan önce bir giriş hatası olması durumunda EOF döndürülür.

Not : Bu argümanlardan en az format belirticilerin sakladığı değer sayısı kadar olmalıdır.



Örnek: sscanf Fonksiyonunu Gösteren C Programı

C
// C program to illustrate sscanf statement #include  int main() {  // declaring array s  char s[] = '3 red balls 2 blue balls';  char str[10] str2[10];  int i;  // %*s is used to skip a word  sscanf(s '%d %*s %*s %*s %s %s' &i str str2);  printf('%d %s %s n' i str str2);  return 0; } 

Çıkış
3 blue balls 

2. C'de scanf_s() Fonksiyonu

Bu işlev Microsoft derleyicilerine özeldir. Arabellek aşırı yüklenmesine neden olmaması dışında scanf ile aynıdır. scanf_s() işlevi, arabellek taşmasını önleyebilecek arabellek boyutunu belirtmek için ek bir parametre sağladığından scanf() işlevinden daha güvenlidir.

Sözdizimi

int   scanf_s  (const char *format [argument]...);

Parametreler

    aktarım: Akışı tanımlayan Dosya nesnesinin işaretçisi.biçim: Tür belirticilerini içeren bir dizedir.… (üç nokta): Fonksiyonun değişken sayıda argüman kabul ettiğini gösterir.

Not : Burada arabellek boyutunu belirleyebilir ve aslında giriş sınırını kontrol edebiliriz, böylece tüm uygulama bellek taşması nedeniyle çökmez.

Dönüş Değeri

  • Başarı durumunda fonksiyon okunan değerlerin sayısını döndürür.
  • Herhangi bir veri başarıyla okunamadan önce bir giriş hatası olması durumunda EOF döndürülür.

Neden scanf_s() kullanılmalı?

scanf sadece konsoldan sağlanan girişi okur. C, kullanıcı girişinin belirlediğiniz değişkene uyup uymayacağını kontrol etmez. color[3] adında bir diziniz varsa ve Red dizisi için scanf kullanırsanız düzgün çalışır ancak kullanıcı 3'ten fazla karakter girerse scanf, color dizisine ait olmayan belleğe yazmaya başlar.

C bunu yakalamaz veya sizi uyarmaz ve renk dizisine ait olmayan bir şeyin o bellek yuvasına erişmeye ve yazmaya çalışmasına bağlı olarak programın çökmesine neden olabilir veya olmayabilir. Scanf_s'nin devreye girdiği yer burasıdır. scanf_s, kullanıcı girişinin verilen bellek alanına sığıp sığmayacağını kontrol eder.

Not : scanf_s() yalnızca Microsoft Visual Studio'da çalışacaktır.

Örnek 1: sscanf_s İşlevini Gösteren C Programı

C
// C program to illustrate sscanf_s statement // scanf_s() will only work in Microsoft Visual Studio. #include  #include  int main() {  char a[5];  // sizeof(a) is buffer size  scanf_s('%s' a sizeof(a));  printf('n%s ' a);  return 0; } 


Giriş 1

Red

Çıkış 1

Red

Giriş 2

Yellow

Çıkış 2

No Output

Örnek 2: Tampon boyutu ile dizi boyutu arasındaki ilişkiyi gösteren C Programı.

C++
// C++ program // consumes the Enter key // (newline character) pressed after input #include  int main() {  // example  char ch[100000];  printf('Enter characters: ');  scanf_s('%s' ch 99999);  getchar();  return 0; } 
C
// C program // consumes the Enter key // (newline character) pressed after input #include  int main() {  char ch[100000];  printf('Enter characters: ');  scanf_s('%s' ch 99999);  getchar();  return 0; } 
  • Arabellek boyutu dizinin boyutuna eşit veya ondan küçükse, arabellek boyutundan büyük veya ona eşit girilmesi, fazla veri kesileceğinden ve arabellek boyutu - 1'e kadar olan veriler okunacağından veri kaybına yol açacaktır.
  • Tampon boyutu bir dizinin boyutundan büyükse o zaman
    • Arabellek boyutundan daha küçük bir giriş yapmak işe yarayacak ancak hata verecektir
    • Arabellek boyutundan daha büyük bir değer girilmesi, arabellek taşmasına neden olur ve aynı hatayı verir.

3. C'de fscanf_s() İşlevi

fscanf() ve fscanf_s() arasındaki fark, scanf() ve scanf_s() ile aynıdır. fscanf_s(), her c C s S ve [ ] tipi alanın boyutunun, değişkenin hemen ardından bir argüman olarak iletilmesini gerektiren güvenli bir işlevdir.

Sözdizimi

int fscanf_s( FILE *stream const char *format [argument ]... );

Parametreler

    cadde: veriyi almak için kullanılan dizebiçim: tür belirticilerini içeren dize… (üç nokta): Fonksiyonun değişken sayıda argüman kabul ettiğini gösterir.

Not : fscanf_s, arabellek boyutunu belirtmek ve gerçekte giriş sınırını kontrol etmek için ekstra bir parametreye sahiptir.

Dönüş Değeri

  • Başarı durumunda fonksiyon başarıyla okunan değerlerin sayısını döndürür.
  • Herhangi bir veri başarıyla okunamadan önce bir giriş hatası olması durumunda EOF döndürülür.

Not : fscanf_s yalnızca MS Visual Studio'da çalışacaktır.

Örnek: fscanf_s İşlevini Gösteren C Programı

C
// C program to illustrate fscanf_s statement // This program will run on MS Visual studio #include  #include  int main() {  char s1[10] s2[10] s3[10];  int year;  // file pointer  FILE* fp;  // Open file securely  fopen_s(&fp 'file.txt' 'w+');  fputs('Hello World its 2017' fp);  rewind(fp);  // Using fscanf_s  fscanf_s(fp '%s' s1 sizeof(s1));  fscanf_s(fp '%s' s2 sizeof(s2));  fscanf_s(fp '%s' s3 sizeof(s3));  fscanf_s(fp '%d' &year sizeof(year));  printf('String1 |%s|n' s1);  printf('String2 |%s|n' s2);  printf('String3 |%s|n' s3);  printf('Integer |%d|n' year);  fclose(fp);  return (0); } 


Çıkış

String1 |Hello| String2 |World| String3 |its| Integer |2017|

4. C'de sscanf_s() İşlevi

sscanf_s(), sscanf()'ın güvenli işlevidir ve güvenli işlevler, her c C s S ve [ tipi alanının boyutunun, değişkenin hemen ardından bir argüman olarak iletilmesini gerektirir.

Sözdizimi

int   sscanf_s  (const char *  restrict buffer   const char *  restrict format   ...);

Parametreler

    cadde: veriyi almak için kullanılan dizebiçim: tür belirticilerini içeren dize… (üç nokta): Fonksiyonun değişken sayıda argüman kabul ettiğini gösterir.

Not : sscanf_s, arabellek boyutunu belirtmek ve gerçekte giriş sınırını kontrol etmek için ekstra bir parametreye sahiptir.

Dönüş Değeri

  • Başarı durumunda fonksiyon başarıyla okunan değerlerin sayısını döndürür.
  • Herhangi bir veri başarıyla okunamadan önce bir giriş hatası olması durumunda EOF döndürülür.

Not : sscanf_s() yalnızca Microsoft Visual Studio'da çalışacaktır.

Örnek: sscanf_s İşlevini Gösteren C Programı

C
// C program to illustrate sscanf_s statement // This program will run on MS Visual studio #include  int main() {  char s[] = '3 red balls 2 blue balls';  char str[10] str2[10];  int i;  // %*s is used to skip a word  sscanf_s(s '%d' &i sizeof(i));  sscanf_s(s '%*d %*s %*s %*s %s' str sizeof(str));  sscanf_s(s '%*d %*s %*s %*s %*s %s' str2  sizeof(str2));  printf('%d %s %s n' i str str2);  return 0; } 


Çıkış

3 blue balls

Test Oluştur