وظائف مكتبة يحمل في ثناياه عوامل لإدخال المستخدم | sscanf، scanf_s، fscanf_s، sscanf_s

توفر لغة البرمجة C العديد من وظائف المكتبة المدمجة لإدخال المستخدم. في هذه المقالة سوف نتعرف على وظائف مكتبة sscanf scanf_s fscanf_s sscanf_s في لغة C.

1. وظيفة sscanf() في لغة C

يتم استخدام sscanf() لقراءة المدخلات المنسقة من السلسلة. تتشابه كل من الدالتين scanf() وsscanf() والفرق الوحيد بينهما هو أن الدالة scanf() تقرأ الإدخال من المستخدم من الإدخال القياسي مثل لوحة المفاتيح ووظيفة sscanf() تقرأ الإدخال من سلسلة وتخزن الإدخال في سلسلة أخرى.

بناء الجملة

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

حدود

    شارع : سلسلة الإدخال التي نريد قراءة البيانات منها. شكل : سلسلة تحتوي على محدد (محددات) النوع. … (حذف) : يشير إلى أن الدالة تقبل عددًا متغيرًا من الوسائط.

قيمة الإرجاع

  • عند النجاح، تقوم الدالة بإرجاع عدد القيم التي تم قراءتها بنجاح.
  • في حالة فشل الإدخال قبل قراءة أي بيانات بنجاح، يتم إرجاع EOF.

ملحوظة : يجب أن يكون عدد هذه الوسائط على الأقل مساويًا لعدد القيم المخزنة بواسطة محددات التنسيق.

مثال: برنامج C لتوضيح وظيفة sscanf

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  ;   }   

الإخراج
3 blue balls  

2. وظيفة scanf_s() في لغة C

هذه الوظيفة خاصة بمترجمي Microsoft. إنه نفس scanf إلا أنه لا يسبب التحميل الزائد للمخزن المؤقت. تعد وظيفة scanf_s() أكثر أمانًا من وظيفة scanf() لأنها توفر معلمة إضافية لتحديد حجم المخزن المؤقت الذي يمكنه تجنب تجاوز سعة المخزن المؤقت.

بناء الجملة

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

حدود

    تدفق : مؤشر إلى كائن الملف الذي يحدد الدفق. شكل : إنها سلسلة تحتوي على محدد (محددات) النوع. … (حذف) : يشير إلى أن الدالة تقبل عددًا متغيرًا من الوسائط.

ملحوظة : هنا يمكننا تحديد حجم المخزن المؤقت والتحكم فعليًا في حد الإدخال حتى لا يتعطل التطبيق بأكمله بسبب تجاوز سعة الذاكرة.

قيمة الإرجاع

  • عند النجاح، تقوم الدالة بإرجاع عدد القيم المقروءة.
  • في حالة فشل الإدخال قبل أن تتم قراءة أي بيانات بنجاح، يتم إرجاع EOF.

لماذا تستخدم scanf_s()؟

يقوم scanf فقط بقراءة أي مدخلات يتم توفيرها من وحدة التحكم. لا يتحقق C مما إذا كان إدخال المستخدم سيتناسب مع المتغير الذي قمت بتعيينه. إذا كان لديك مصفوفة تسمى color[3] واستخدمت scanf للسلسلة Red، فستعمل بشكل جيد ولكن إذا أدخل المستخدم أكثر من 3 أحرف، فسيبدأ scanf في الكتابة في الذاكرة التي لا تنتمي إلى مصفوفة الألوان.

لن يلتقط C هذا أو يحذرك وقد يؤدي إلى تعطل البرنامج أو لا يتعطل اعتمادًا على ما إذا كان هناك شيء يحاول الوصول إلى فتحة الذاكرة هذه والكتابة عليها والتي لا تنتمي إلى مجموعة الألوان. هذا هو المكان الذي يلعب فيه scanf_s. يتحقق scanf_s من احتواء إدخال المستخدم في مساحة الذاكرة المحددة.

ملحوظة : scanf_s() سوف يعمل فقط في Microsoft Visual Studio.

مثال 1: برنامج C لتوضيح وظيفة sscanf_s

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  ;   }   


الإدخال 1

Red 

الإخراج 1

Red 

الإدخال 2

Yellow 

الإخراج 2

No Output 

المثال 2: برنامج C لتوضيح العلاقة بين حجم المخزن المؤقت وحجم المصفوفة.

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  ;   }   
  • إذا كان حجم المخزن المؤقت يساوي أو أصغر من حجم المصفوفة، فإن إدخال حجم أكبر من أو يساوي حجم المخزن المؤقت سيؤدي إلى فقدان البيانات حيث سيتم اقتطاع البيانات الزائدة وستتم قراءة البيانات حتى حجم المخزن المؤقت - 1.
  • إذا كان حجم المخزن المؤقت أكبر من حجم المصفوفة
    • إن إدخال حجم أصغر من حجم المخزن المؤقت سوف ينجح ولكنه سيعطي خطأ
    • سيؤدي إدخال حجم أكبر من حجم المخزن المؤقت إلى تجاوز سعة المخزن المؤقت ويعطي نفس الخطأ.

3. وظيفة fscanf_s() في لغة C

الفرق بين fscanf() وfscanf_s() هو نفس الفرق بين scanf() وscanf_s(). fscanf_s() هي وظيفة آمنة تتطلب حجم كل حقل من النوع c C s S و[ ] ليتم تمريره كوسيطة بعد المتغير مباشرة.

بناء الجملة

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

حدود

    شارع : السلسلة المستخدمة لاسترداد البيانات شكل : سلسلة تحتوي على محدد (محددات) النوع … (حذف) : يشير إلى أن الدالة تقبل عددًا متغيرًا من الوسائط.

ملحوظة : يحتوي fscanf_s على معلمة إضافية لتحديد حجم المخزن المؤقت والتحكم فعليًا في حد الإدخال.

قيمة الإرجاع

  • عند النجاح، تقوم الدالة بإرجاع عدد القيم التي تمت قراءتها بنجاح.
  • في حالة فشل الإدخال قبل أن تتم قراءة أي بيانات بنجاح، يتم إرجاع EOF.

ملحوظة : fscanf_s سيعمل فقط في MS Visual studio.

مثال: برنامج C لتوضيح وظيفة fscanf_s

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  );   }   


الإخراج

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

4. وظيفة sscanf_s() في لغة C

sscanf_s() هي وظيفة آمنة لـ sscanf() وتتطلب الوظائف الآمنة حجم كل حقل من النوع c C s S و[ type ليتم تمريره كوسيطة بعد المتغير مباشرة.

بناء الجملة

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

حدود

    شارع : السلسلة المستخدمة لاسترداد البيانات شكل : سلسلة تحتوي على محدد (محددات) النوع … (حذف) : يشير إلى أن الدالة تقبل عددًا متغيرًا من الوسائط.

ملحوظة : يحتوي sscanf_s على معلمة إضافية لتحديد حجم المخزن المؤقت والتحكم فعليًا في حد الإدخال.

قيمة الإرجاع

  • عند النجاح، تقوم الدالة بإرجاع عدد القيم التي تمت قراءتها بنجاح.
  • في حالة فشل الإدخال قبل أن تتم قراءة أي بيانات بنجاح، يتم إرجاع EOF.

ملحوظة : sscanf_s() سوف يعمل فقط في Microsoft Visual Studio.

مثال: برنامج C لتوضيح وظيفة sscanf_s

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  ;   }   


الإخراج

3 blue balls 

إنشاء اختبار