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 dize biç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 dize biç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