Úvod do programovania v jazyku C

Doc. Ing. Pavel Horovčák, CSc., Prof. RNDr. Igor Podlubný, CSc.

Táto on-line príručka vznikla v rámci riešenia výskumného projektu KEGA č. 112/97 "uniWWWerzita"

  1. Úvod
  2. Preprocesor jazyka C
  3. Premenné
  4. Lexikálne prvky jazyka
  5. Riadiace štruktúry
  6. Štandardný vstup a výstup
  7. Reťazce
  8. Súbory
  9. Smerníky
  10. Datové štruktúry
  11. Triedenie
  12. Terminálové funkcie (QNX)
  13. Doporučená literatúra

6 Štandardný vstup a výstup

     Prostriedky pre vstup a výstup (so štandardnými zariadeniami - klávesnica a obrazovka, i so súbormi) nie sú priamou súčasťou C jazyka, ale sú poskytované vo forme štandardných knižníc, t.j. include súborov. Označenie štandardných zariadení pre vstup a výstup : stdin pre vstup, stdout pre výstup a stderr pre výstup chybových správ.

6.1 Vstupno-výstupná komunikácia

Vstupno - výstupná komunikácia sa môže uskutočňovať na troch úrovniach :

     - Úroveň práce so znakmi je podporovaná dvoma funkciami :

  int getchar(void)  pre vstup znaku
  int putchar(int)   pre výstup znaku

Funkcia getchar nemá argument a vracia ako hodnotu kódovú reprezentáciu znaku, ktorý bol na vstupe (stdin). Ak na stdin sa nenachádza žiadny znak (koniec súboru), getchar vráti hodnotu EOF.
Funkcia putchar má argument typu int, ktorý sa zapíše do výstupu stdout. Ako hodnotu vracia zapísaný znak, ak zápis prebehol normálne, inak vracia EOF (pri chybe počas výstupu).

- Úroveň práce s reťazcami je tiež podporovaná dvoma funkciami :

  char *gets(char *string);
  int   puts(char *string);

Funkcia gets slúži pre vstup reťazca do premennej string zo vstupu stdin, funkcia puts naopak pre výstup reťazca string na výstup stdout. Funkcia puts pridáva k výstupnému reťazcu nový riadok. Vracia nulu, ak nie je chyba, inak EOF.

- Úroveň formátovaných hodnôt - formátovaný vstup - výstup je tiež podporovaná dvoma štandardnými funkciami :

  int printf(const char *format,arg1,...,argn);
  int scanf(const char *format,&arg1,...,&argn);

Tieto funkcie umožňujú výstup, resp. vstup údajov v predpísanom tvare. Počet výstupných (vstupných) údajov (t.j. argumentov funkcií print, scanf) je voliteľný, je možný aj počet n = 0. V prípade výstupu stačí uvádzať argumenty vo forme jednoduchých identifikátorov, resp. konštánt.
Pokiaľ sa jedná o vstup, všimnime si, že funkcie scanf vyžaduje zadanie adries jednotlivých argumentov (znak &). V prípade nedodržania tohoto požiadavku vznikajú nepríjemné chyby.
Funkcia printf vracia počet vytlačených znakov, resp. záporné číslo pri chybe.
Tieto funkcie vracajú počet vykonaných formátových konverzií. Spracovanie je ukončené pri výskyte prvého konfliktného znaku alebo konca súboru EOF, vracajú EOF ak nastane chyba na vstupe pred vykonaním formátovej konverzie. Predpísaný tvar výstupu jednotlivých argumentov obsahuje reťazec format. V tomto reťazci sa okrem znakov (textu), ktorý sa automaticky okopíruje na výstup, musí nachádzať pre každý argument jedna tzv. formátová konverzia, ktorá obsahuje konkrétny predpis pre prevod hodnoty argumentu z vnútorného (binárneho) tvaru na požadovaný vonkajší tvar. Každá formátová konverzia sa povinne začína znakom %, po ktorom nasleduje vlastný popis konverzie. Všetky znaky, ktoré nepatria do formátovej konverzie, sa kopírujú na výstup. Popis konverzie (jednotlivé parametre sa uvádzajú bez medzier, hranaté zátvorky znamenajú voliteľné použitie) má obecný tvar :

  %[príznak][šírka][.presnosť][modifikátor]konverzia

pričom zložky popisu konverzie možno rozdeliť na povinné a  nepovinné. Samotná konverzia je vždy povinná, ostatné zložky sú nepovinné. Význam jednotlivých zložiek je tento :

Vstup a výstup reťazca pomocou všetkých troch úrovní práce ilustruje nasledujúci príklad:

/* priklad pr6_1.c  vstup - vystup retazca */
#include <stdio.h>

void main(void)
{
  charf s2[30],s3[30],*s1=s3;
  int i=0;

  printf("Vstup retazca 1.po znakoch:");
  while ((s2[i] = getchar()) != '\n') i++;
  s2[i++] = '\n';
  s2[i] = '\0';
  for (i = 0 ; s2[i] != '\0' ; i++) putchar(s2[i]);
  printf("Vstup retazca 2.po znakoch:");
  while ((*s1++ = getchar()) != '\n');
  *s1++ = '\n';
  *s1 = '\0';
  for (i = 0 ; s3[i] != '\0' ; i++) putchar(s3[i]);

  printf("Vstup retazca 1.gets:");
  gets(s2);
  puts(s2);
  printf("Vstup retazca 2.gets:");
  s1 = s3;
  gets(s1);
  puts(s1);

  printf("Vstup retazca 1.scanf:");
  scanf("%s", s2);
  printf("Printf s2 = %s\n", s2);
  printf("Vstup retazca 2.scanf:");
  scanf("%s", s1);
  printf("Printf s1 = %s\n", s1);
}




6.2 Vstup z pamäte a výstup do pamäte

     V niektorých prípadoch sa používa formátovaný vstup - výstup v spojitosti nie s vonkajšími zariadeniami (stdin, stdout), ale s reťazcom. Tento vstup - výstup teda umožňuje vykonávať prevod medzi vnútorným tvarom a znakovou reprezentáciou (ASCII) tohoto tvaru. K  dispozícii sú pre tento účel dve štandardné funkcie sprintf a sscanf, ktoré sa od vyššie popísaných funkcií printf a scanf líšia iba ďalším argumentom str, ktorý označuje príslušný reťazec (použitý vo funkcii vstupu - výstupu). Ich tvar je :

  int sprintf(char *str,const char *format,arg1,...,argn);
  int sscanf(char *str,const char *format,&arg1,...,&argn);

pričom str je smerník na príslušný vstupný (výstupný) reťazec, ostatné parametre viď vyššie. Prácu s týmito funkciami ilustruje príklad prevodu čísel do reťazca a späť :

/* priklad pr6_2.c vstup - vystup do retazca */
#include <stdio.h>

void main(void)
{
  char s2[30],s3[30];
  int i=0;
  float r;

  i=3;
  sprintf(s2,"Hodnota i = %d",i);
  /* obsahom reťazca s2 bude: Hodnota i = 3 */
  printf("Retazec s2 = %s\n",s2);
  /* obsahom reťazca s3 bude: 33 3.14  */
  strcpy(s3,"33 3.14");
  printf("Retazec s3 = %s\n",s3);
  sscanf(s3,"%d %f",&i,&r);
  /* obsahom premenných bude i:33, r:3.14 */
  printf("Hodnota i = %d r = %f\n",i,r);
}