المقدمة
نحن جميعًا على دراية بوظيفة scanf()
. إنها الوظيفة الرئيسية المطبقة لأخذ إدخالات المستخدم الأساسية. على الرغم من أن scanf()
تعمل بشكل جيد أثناء أخذ الإدخالات مثل العدد الصحيح، الحرف، العدد عائم إلخ، إلا أنها تتأخر بالتأكيد عند أخذ إدخالات السلسلة التي تحتوي على مسافات بيضاء. دعونا نلقي نظرة على مثال،
#include<stdio.h>
int main()
{
char string[10];
printf("Enter the string: ");
scanf("%s", string);
printf("\n %s",string);
return 0;
}
الناتج:

كما يمكننا ملاحظة ذلك من المثال أعلاه. 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;
}
الناتج:

قارن الناتج مع استخدام 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!’. في هذه الحالة، سيكون الإخراج من الشيفرة أعلاه على النحو التالي:

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;
}
الإخراج:

الختام
على الرغم من أن كل من الوظائف gets()
و fgets()
يمكن استخدامها لقراءة مدخلات السلسلة، إلا أن الفارق الكبير بين الاثنين هو حقيقة أن الأخير يسمح للمستخدم بتحديد حجم النطاق. لذلك يُنصح بشدة باستخدامه على الوظيفة gets()
.
الوظيفة gets()
لا توفر الحالة إذا كانت المدخلات أكبر من النطاق. ونتيجة لذلك، قد يحدث انسداد الذاكرة. هذا هو المكان الذي تتألق فيه الوظيفة fgets()
وتوفر حلاً نهائيًا.
المراجع
Source:
https://www.digitalocean.com/community/tutorials/fgets-and-gets-in-c-programming