Ποια είναι η διαφορά μεταξύ fgets και παίρνει in c προγραμματισμού;


Απάντηση 1:

Differencebetweenfgetsand[math]gets[/math]inCprogramminglanguage.Difference between fgets and [math]gets[/math] in C programming language.

gets () & fgets () - Χρησιμοποιείται για να πάρει μια τιμή String με διαστήματα αντίθετα από το scanf () ο λευκός χώρος δεν είναι ένας Delimiter σε get () και fgets () στη γλώσσα προγραμματισμού C.

παίρνει - Χρησιμοποιείται για να πάρει μια ολόκληρη σειρά από το χρήστη κατά μήκος λευκών χώρων.

Οι περισσότεροι από τους μεταγλωττιστές έχουν αυτό το πρόβλημα λέγοντας ότι "η προειδοποίηση: η λειτουργία" παίρνει "είναι επικίνδυνη και δεν πρέπει να χρησιμοποιηθεί." Σε τέτοιες περιπτώσεις μπορούμε να προχωρήσουμε με fgets () που δεν προκαλεί τέτοια Σφάλματα.

fgets - Είναι παρόμοιο με το get () παίρνει την είσοδο μόνο από το stdin (Standard Input Stream) ενώ το fgets () μπορεί να πάρει την είσοδο από τα αρχεία και ακόμη και από το stdin.

Σύνταξη fgets για το χειρισμό αρχείων:

char * fgets (char * str, int n, FILE * ρεύμα)

Παράδειγμα:

#include 

int main () {
   ΑΡΧΕΙΟ * fp;
   char str [60].

   / * άνοιγμα αρχείου για ανάγνωση * /
   fp = fopen ("αρχείο.txt", "r");

   αν (fgets (str, 60, fp)! = NULL) {
      / * γραφή περιεχομένου σε stdout * /
      βάζει (str)?
   }}
   fclose (fp);
   
   επιστροφή (0);
}}

Απάντηση 2:

Ποτέ μη χρησιμοποιήσετε παίρνει. Δεν προσφέρει προστασία από μια ευπάθεια υπερχείλισης buffer (δηλαδή, δεν μπορείτε να το πείτε πόσο μεγάλο είναι το buffer που περνάτε σε αυτό, έτσι δεν μπορεί να εμποδίσει έναν χρήστη να εισάγει μια γραμμή μεγαλύτερη από τη μνήμη buffer και clobbering).

fgets είναι ασφαλής επειδή μπορείτε να σας εγγυηθώ ότι ποτέ δεν υπερχειλίσετε το buffer string εισόδου περνώντας στο μέγεθος του buffer (που περιλαμβάνει χώρο για το NULL.)


Απάντηση 3:

παίρνει () διαβάζει μια γραμμή από stdin στο buffer που υποδεικνύεται από το s μέχρι και μια τερματισμένη νέα γραμμή ή EOF, την οποία αντικαθιστά με ένα μηδενικό byte (aq \ 0aq). Δεν πραγματοποιείται έλεγχος για υπέρβαση buffer.

Το fgets () διαβάζει σε ένα πολύ λιγότερο από το μέγεθος χαρακτήρες από το ρεύμα και τις αποθηκεύει στο buffer που υποδεικνύεται από το s. Η ανάγνωση σταματά μετά από ένα EOF ή μια νέα γραμμή. Αν διαβαστεί μια νέα γραμμή, αποθηκεύεται στο buffer. Ένα τερματισμένο μηδενικό byte (aq \ 0aq) αποθηκεύεται μετά τον τελευταίο χαρακτήρα στο buffer.

Πηγή: fgets (3): εισαγωγή χαρακτήρων / συμβολοσειρών


Απάντηση 4:

Η πιο σημαντική διαφορά είναι ότι το fgets () ξέρει πόσο μεγάλο είναι το stringis και παίρνει () όχι. Αυτό σημαίνει ότι είναι σχεδόν αδύνατο να writesafe κώδικα χρησιμοποιώντας get () έτσι δεν το κάνουμε.

  • Ποτέ μη χρησιμοποιήσετε παίρνει. Δεν προσφέρει προστασία από την ευπάθεια υπερχείλισης buffer (δηλαδή, δεν μπορείτε να το πείτε πόσο μεγάλο είναι το buffer που μεταφέρετε σε αυτό, έτσι δεν μπορεί να εμποδίσει έναν χρήστη να εισάγει μια γραμμή μεγαλύτερη από τη μνήμη buffer και clobbering). Αποφύγετε τη χρήση scanf. Αν δεν χρησιμοποιηθεί προσεκτικά, μπορεί να έχει τα ίδια προβλήματα υπερχείλισης buffer όπως παίρνει. Ακόμα και αν αγνοήσετε αυτό, έχει και άλλα προβλήματα που δυσκολεύουν να τα χρησιμοποιήσετε σωστά. Σε γενικές γραμμές θα πρέπει να χρησιμοποιείτε fgets, αν και κάποιες φορές είναι ενοχλητικές (πρέπει να αφαιρέσετε τη νέα γραμμή, πρέπει να καθορίσετε ένα μέγεθος buffer μπροστά από το χρόνο, τι να κάνετε με τις γραμμές που είναι πολύ μεγάλες - κρατάτε το μέρος που διαβάζετε και απορρίπτετε την περίσσεια, απορρίψτε το όλο θέμα, αυξήστε δυναμικά το buffer και δοκιμάστε ξανά κλπ.). Υπάρχουν ορισμένες μη τυποποιημένες λειτουργίες που κάνουν αυτή τη δυναμική κατανομή για εσάς (π.χ. getline στα POSIX συστήματα, λειτουργία ggets του δημόσιου τομέα του Chuck Falconer). Σημειώστε ότι το ggets έχει σαν-σημασιολογική μορφή σαν να διαγράφει μια νέα γραμμή προς τα πίσω για εσάς.