logo

وظائف مكتبة يحمل في ثناياه عوامل لإدخال المستخدم | 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 في الكتابة في الذاكرة التي لا تنتمي إلى مصفوفة الألوان.

755 شمود

لن يلتقط 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

إنشاء اختبار