V jazyce C, scanf() funkce se používá ke čtení formátovaného vstupu ze stdin. Vrátí celý počet znaků zapsaných v něm jinak, vrátí zápornou hodnotu.
Syntax:
int scanf(const char *characters_set)>
Časová náročnost: Na)
Pomocný prostor: O(n) kde n je délka vstupu.
Mnoho z nás zná tradiční použití scanf. No, tady jsou některé z méně známých faktů
spojový seznam
Jak číst pouze část vstupu, který potřebujeme?
Vezměme si například nějaký vstupní proud, který obsahuje pouze znaky následované celým číslem nebo plovoucí čárkou. A my potřebujeme skenovat pouze toto celé číslo nebo plovoucí číslo.
Příklad:
Input : 'this is the value 100', Output : value read is 100 Input : 'this is the value 21.2', Output : value read is 21.2>C
// C program to demonstrate that // we can ignore some string // in scanf() #include int main() { int a; scanf('This is the value %d', &a); printf('Input value read : a = %d', a); return 0; } // Input : This is the value 100>
Nyní předpokládejme, že nevíme, co jsou předchozí znaky, ale určitě víme, že poslední hodnota je celé číslo. Jak můžeme naskenovat poslední hodnotu jako celé číslo?
Níže uvedené řešení funguje pouze v případě, že vstupní řetězec neobsahuje mezery. Například,
Vstup
'blablabla 25'>C
// C program to demonstrate use of *s #include int main() { int a; scanf('%*s %d', &a); printf('Input value read : a=%d', a); return 0; }> Výstup
Input Value read : 25>
Vysvětlení : %*s v scanf se používá k ignorování některých vstupů podle potřeby. V tomto případě ignoruje vstup až do další mezery nebo nového řádku. Podobně, pokud napíšete %*d, bude ignorovat celá čísla až do další mezery nebo nového řádku.
Obecné použití scanf():
C // C program to demonstrate general use of scanf() #include int main() { int a; scanf('%d', &a); printf('a = %d', a); return 0; }> Vstup
2>
Výstup
a = 2>
Výše uvedený fakt se na první pohled nemusí zdát jako užitečný trik. Abychom porozuměli jeho použití, podívejme se nejprve na fscanf().
Funkce fscanf v C
Už vás nebaví všechna ta nemotorná syntaxe ke čtení ze souborů? fscanf přichází na pomoc. Tato funkce slouží ke čtení formátovaného vstupu z daného streamu v jazyce C.
Syntax:
int fscanf(FILE *ptr, const char *format, ...)>
fscanf čte ze souboru, na který ukazuje ukazatel FILE (ptr), namísto čtení ze vstupního proudu.
parciální derivát v latexu
Návratová hodnota: Vrátí nulu nebo EOF, pokud není úspěšný. V opačném případě vrátí počet úspěšně přiřazených položek.
Časová náročnost: Na)
Pomocný prostor: O(n) kde n je délka vstupu.
Příklad 1: Zvažte následující textový soubor abc.txt
NAME AGE CITY abc 12 hyderabad bef 25 delhi cce 65 bangalore>
Nyní chceme číst pouze pole města výše uvedeného textového souboru a ignorovat všechna ostatní pole. Kombinace fscanf a výše uvedeného triku to dělá snadno
C // C Program to demonstrate fscanf #include // Driver Code int main() { FILE* ptr = fopen('abc.txt', 'r'); if (ptr == NULL) { printf('no such file.'); return 0; } /* Assuming that abc.txt has content in below format NAME AGE CITY abc 12 hyderabad bef 25 delhi cce 65 bangalore */ char buf[100]; while (fscanf(ptr, '%*s %*s %s ', buf) == 1) printf('%s
', buf); return 0; }> Výstup
c pole řetězců programu
CITY hyderabad delhi bangalore>
Příklad 2: Zvažte následující binární soubor program.bin
n1 n2 n3 1 5 6 2 10 11 3 15 16 4 20 21>
Ke čtení všech hodnot n1, n2 a n3 přihrádky používáme fscanf()
C #include #include struct threeNum{ int n1, n2, n3; }; int main(){ int n; struct threeNum num; FILE *fptr; if ((fptr = fopen('program.bin','rb')) == NULL){ printf('Error! opening file'); // Program exits if the file pointer returns NULL. exit(1); } for(n = 1; n < 5; ++n){ fread(&num, sizeof(struct threeNum), 1, fptr); printf('n1: %d n2: %d n3: %d', num.n1, num.n2, num.n3); } fclose(fptr); return 0; } //Code submitted by Susobhan Akhuli> Výstup
n1: 1 n2: 5 n3: 6 n1: 2 n2: 10 n3: 11 n1: 3 n2: 15 n3: 16 n1: 4 n2: 20 n3: 21>
Podívejme se na rozdíly v tabulkové formě -:
| scanf() | fscanf() | |
| 1. | Používá se ke čtení standardního vstupu. | Tato funkce se používá ke čtení vstupu ze souboru |
| 2. | Jeho syntaxe je -: scanf(const char *formát, …) | Jeho syntaxe je -: fscanf(FILE *stream, const char *formát, …) |
| 3. | Vyžaduje, aby specifikátory formátu převzaly vstup určitého typu. | Přečte proud ve formě bajtu |
| 4. | Vyžaduje tři parametry, které jsou: Znak mezery , Znak bez mezer, Specifikátory formátu | Je definován v záhlaví souboru #include |