fgets() و gets() في برمجة C

المقدمة

نحن جميعًا على دراية بوظيفة scanf(). إنها الوظيفة الرئيسية المطبقة لأخذ إدخالات المستخدم الأساسية. على الرغم من أن scanf() تعمل بشكل جيد أثناء أخذ الإدخالات مثل العدد الصحيح، الحرف، العدد عائم إلخ، إلا أنها تتأخر بالتأكيد عند أخذ إدخالات السلسلة التي تحتوي على مسافات بيضاء. دعونا نلقي نظرة على مثال،

#include<stdio.h>
int main()
{
    char string[10];
    printf("Enter the string: ");
    scanf("%s", string);
    printf("\n %s",string);
    return 0;
}

الناتج:

Problem With scanf()

كما يمكننا ملاحظة ذلك من المثال أعلاه. scanf() يتوقف عن المسح بمجرد مواجهته مسافة بيضاء أو سطر جديد. وهذا، في الواقع، يجعل أخذ إدخالات السلسلة باستخدام scanf() أمرًا مزعجًا قليلاً. يمكن تجنب ذلك بسهولة عن طريق استخدام بعض الوظائف الأخرى للإدخال مثل gets() و fgets().

في هذا المقال، سنتعلم كيفية تطبيق كلتا الوظيفتين ومقارنتهما جنبًا إلى جنب.

وظيفة gets() في لغة البرمجة C

gets() هي وظيفة محددة مسبقًا في لغة البرمجة C تُستخدم لقراءة سلسلة أو سطر نصي وتخزين الإدخال في متغير سلسلة معرف بشكل جيد. تنهي الوظيفة جلستها في القراءة بمجرد مواجهتها لرمز السطر الجديد.

الصياغة:

gets( اسم المتغير );

الشيفرة المعطاة أدناه توضح استخدام وظيفة gets()،

#include<stdio.h>
int main()
{
    char string[10];
    printf("Enter the String: ");
    gets(string);
    printf("\n%s",string);
    return 0;
}

الناتج:

Use Of Gets

قارن الناتج مع استخدام scanf(). ‘مرحبا بالعالم’ يعامل الآن كـ سلسلة واحدة.

وظيفة fgets() في اللغة C

توفر مكتبة الـ C القياسية لنا أيضًا وظيفة أخرى، وهي وظيفة fgets(). تقوم الوظيفة بقراءة سطر نصي أو سلسلة من الملف المحدد أو من وحدة التحكم، ثم تخزنها في متغير السلسلة المقابل.

مشابهة لوظيفة gets()، تتوقف fgets أيضًا عن القراءة عندما تصل إلى حرف نهاية السطر. ولكن بالإضافة إلى ذلك، على عكس gets()، تتوقف الوظيفة أيضًا عندما يتم الوصول إلى نهاية الملف أو حتى إذا تجاوزت طول السلسلة الحد المحدد، n-1.

الصيغة،

fgets(char *str، int n، FILE *stream)

  • str – هو المتغير الذي ستخزن فيه السلسلة
  • n – It is the maximum length of the string that should be read
  • stream – هو مؤشر الملف، من حيث يتم قراءة السلسلة.

لحسن الحظ، يمكننا قراءة سطور النص من ملف أو تيار الإدخال القياسي باستخدام وظيفة fgets(). دعنا نرى كيف

1. اقرأ من الملف المعطى باستخدام fgets()

على سبيل المثال،

#include<stdio.h>
int main()
{
    char string[20];
    FILE *fp;
    fp=fopen("file.txt","r");
    fgets(string,20,fp);
    printf("The string is: %s",string);
    fclose(fp);
    return 0;
}
    

افترض أن file.txt يحتوي على السطر ‘مثال fgets() لـ JournalDev!’. في هذه الحالة، سيكون الإخراج من الشيفرة أعلاه على النحو التالي:

fgets() file input

2. اقرأ من stdin باستخدام fgets()

#include<stdio.h>
int main()
{
    char string[20];
    printf("Enter the string: ");
    fgets(string,20,stdin);         #input from stdin stream
    printf("\nThe string is: %s",string);
    return 0;
}

الإخراج:

fgets() Stdin Input

الختام

على الرغم من أن كل من الوظائف gets() و fgets() يمكن استخدامها لقراءة مدخلات السلسلة، إلا أن الفارق الكبير بين الاثنين هو حقيقة أن الأخير يسمح للمستخدم بتحديد حجم النطاق. لذلك يُنصح بشدة باستخدامه على الوظيفة gets().

الوظيفة gets() لا توفر الحالة إذا كانت المدخلات أكبر من النطاق. ونتيجة لذلك، قد يحدث انسداد الذاكرة. هذا هو المكان الذي تتألق فيه الوظيفة fgets() وتوفر حلاً نهائيًا.

المراجع

Source:
https://www.digitalocean.com/community/tutorials/fgets-and-gets-in-c-programming