Verschil tussen scanf() en fgets()

Ik wil weten wat het verschil is tussen fgets() en scanf(). Ik gebruik C als mijn platform.


Antwoord 1, autoriteit 100%

Er zijn meerdere verschillen. Twee cruciale zijn:

  • fgets() kan lezen uit elk geopend bestand, maar scanf() leest alleen standaardinvoer.
  • fgets() leest ‘een regel tekst’ uit een bestand; scanf() kan daarvoor worden gebruikt, maar verwerkt ook conversies van tekenreeksen naar ingebouwde numerieke typen.

Veel mensen zullen fgets() gebruiken om een ​​regel met gegevens te lezen en vervolgens sscanf() gebruiken om het te ontleden.


Antwoord 2, autoriteit 27%

int scanf(const char * restrict format, ...);

scanf(3) zoekt naar een bepaald patroon gedefinieerd door het format-argument op de gegeven invoer bekend als stdin, waar het patroon door jou is gedefinieerd. De gegeven invoer voor scanf(3) kan, afhankelijk van de variant (scanf, fscanf, sscanf, vscanf, vsscanf, vfscanf), een string of een bestand zijn.

char *fgets(char * restrict str, int size, FILE * restrict stream);

fgets(3) leest gewoon een regel uit het invoerbestand stream en kopieert de bytes als null-beëindigende string naar de buffer str en beperk de uitvoer naar de buffer tot bepaalde bytes in grootte.


Antwoord 3, autoriteit 23%

Scanf voert geen grenscontrole uit. fgets zal waarschijnlijk de betere keuze zijn. U kunt dan sscanf() gebruiken om het te evalueren.

Goede discussie over het onderwerp hier-
http://cboard.cprogramming.com/c-programming/ 109243-scanf-vs-fgets.html

Hoe sta je spaties toe in te voeren met scanf? (Dat was mijn kwaadaardige tweelingbroer die de les kreeg omdat hij dit was vergeten – ik niet)


Antwoord 4, autoriteit 8%

Opgemerkt moet worden dat de patroonspecificaties van scanf veldbreedtelimieten toestaan:

scanf( " %80s", mybuffer );

Maar waar printf() toestaat dat de breedte als variabele wordt doorgegeven (met ‘*’):

printf( "My name is %*s.\n", 20, name );

scanf() niet. (Het interpreteert de ‘*’ als een vlag om het veld volledig te onderdrukken/negeren.) Wat betekent dat je dingen als volgt doet:

#define NAMEWIDTH 40
char buffer[ NAMEWIDTH + 4 ];
...
scanf( " %40x", buffer );

en geen manier om de veldbreedte 40 in de scanf() te verbinden met de bufferbreedte 40 in de bufferdeclaratie.


Antwoord 5, autoriteit 4%

scanf ontleedt een string die je hebt ingelezen (of gemaakt), en fgets leest een regel uit een open FILE*. Of bedoel je fscanf?


Antwoord 6, autoriteit 4%

Het belangrijkste verschil ligt in het feit dat scanf geen limiet heeft op het aantal tekens dat kan worden gelezen (in het standaardgebruik), terwijl fgets heeft een maximum aantal tekens dat kan worden gelezen.

Bekijk het prototype van de twee functies:

char * fgets (char * dest, int size, FILE * stream);

int scanf (const char * formaat, …);

Je kunt zien dat de tweede parameter van fgets oplegt om maximaal char te lezen.

Een ander duidelijk verschil is de retourwaarde: fgets retourneert een verwijzing naar dest bij succes; scanf retourneert het aantal invoeritems dat met succes is afgestemd en toegewezen.
Vervolgens scant de functie scanf de invoer volgens formaat en leest de invoer uit de standaardinvoerstroom stdin, terwijl fgets leest standaard invoer van FILE * stream.

Concluderend, je zou scanf kunnen gebruiken om gegevens uit een BESTAND te lezen en deze in een array met een vaste grootte in te voegen (bijvoorbeeld) heeft niet veel zin.
Een voordeel van scanf is de opmaak van uitvoergegevens: als de functie 12345\n is, is de uitvoer 12345, terwijl de fgets leest en geeft terug tot \n (inbegrepen), met aan het eind een \0 als tekenreeksterminator.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

eighteen − 3 =

Other episodes