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(), הפונקציה גם מפסיקה כאשר נתקלת ב־EOF או אפילו אם אורך המחרוזת חורג מהמגבלה המפורטת, 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 מכיל את השורה ‘JournalDev fgets() example!’. במקרה זה, פלט של הקוד לעיל יהיה,

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