Table of Contents

Lab 02 - Vstup a výstup programu

Cíle cvičení

  1. Podmínky a cykly (řídicí struktury), operátory.
  2. Standardní vstup a výstup: getchar a putchar.
  3. Formátovaný vstup a výstup - scanf,printf a fprintf.
  4. Ověření, že vstup byl načten a je správný.

Úkoly

První cyklus

#include <stdio.h>
 
int main(void)
{
   printf("I like b3b36prg!\n");
   printf("I like b3b36prg!\n");
   printf("I like b3b36prg!\n");
   printf("I like b3b36prg!\n");
 
   return 0;
}

který následně upravte využitím cyklu

#include <stdio.h>
 
int main(void)
{
   for (int i = 0; i < 4; ++i) {
      printf("I like b3b36prg!\n");
   }
   return 0;
}

Vyzkoušejte kompilaci a spuštění programu, např.

clang program.c && ./a.out 

nebo

clang program.c -o program && ./program 

Zpracování vstupních argumentů programu

#include <stdio.h>
 
int main(int argc, char *argv[])
{
   for (int i = 0; i < argc; ++i) {
      printf("I like b3b36prg!\n");
   }
   return 0;
}

Standardní vstup programu

int r = getchar();
for (int i; i < r; ++i) {
   printf("I like b3b36prg!\n");
}

Je uvedný program správně? Bude vždy fungovat podle očekávání?

#include <stdio.h>
 
int main(void)
{
   int r = getchar();
   r = r - '0';
   for (int i = 0; i < r; ++i) {
      printf("I like b3b36prg!\n");
   }
   return r < 0 || r > 9;
}

./program <in.txt; echo $?
./program <empty.txt; echo $?
echo 'a' | ./program; echo $?

Načtení celého čísla (více cifer)

Dosud jsme načítali pouze jeden znak (cifru). Pokud však chceme načíst číslo jako např. 123, musíme číst znaky jeden po druhém a postupně z nich sestavit výslednou číselnou hodnotu.

Formátovaný vstup a výstup

#include <stdio.h>
 
int main(void)
{
   int ret = 0;
   int n;
   int r = scanf("%d", &n);
   if (r == 1) {
      for (int i = 0; i < n; ++i) {
	 printf("I like b3b36prg!\n");
      }
   } else {
      fprintf(stderr, "ERROR: Wrong input!\n");
      ret = 100;
   }
   return ret;
}

int n;
int r = scanf("%d", &n);
fprintf(stderr, "DEBUG: r: %d n: %d\n", r, n);

clang program.c && echo 4 | ./a.out | wc

if (n >= 0 && n <= 9) {
...
} else {
  fprintf(stderr, "ERROR: Out of range!\n");
  ret = 101;
}

void print_line(int n)
{
   for (int i = 0; i < n; ++i) {
      printf("I like b3b36prg!\n");
   }
}

Vyzkoušejte program ukončení vstupu bez zadání znaku, tzv. EOT znakem (https://en.wikipedia.org/wiki/End-of-Transmission_character), který zadát kombinací Ctrl+D nebo Ctrl+Z podle použitého OS.

Další úkoly (na doma)

echo 10 | ./out
echo 10 | ./out | wc
echo 10 | ./out > output.txt
cat output.txt
wc output.txt

int r, n;
while ((r = scanf("%d", &n)) == 1) {
   // increment of the counter
}
if (r == 0) {
   fprintf(stderr, "ERROR: Wrong input detected!\n");
   ret = 100;
} else {
   fprintf(stderr, "ERROR: Number lines %d!\n", counter);
   ret = 101;
}

echo 10 | ./out > output.txt
./in < output.txt