Table of Contents

2 - Vstup a výstup programu

Cíle cvičení

  1. Kompilace a spuštění programu.
  2. Návratová hodnota programu a její zpracování v OS.
  3. První cyklus.
  4. Vstup a výstup programugetchar a standardní výstup - putchar.
  5. Formátovaný vstup a výstup - scanf,printf a fprintf.
  6. Operátory a základní datové typy - char, int, float, double.
  7. Standardní vstup, výstup a chybový výstup a jejich přesměrování.

Úkoly

Kompilace a spouštění programu

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

./program0 && ./program1
./program1 && ./program0
a
./program0 && echo $? && ./program1 && echo $?
./program1 && echo $? && ./program0 && echo $?

a dále pak

./program0 && echo $? && ./program1; echo $?
./program1; echo $? && ./program0 && echo $?

První cyklus

#include <stdio.h>
 
int main(void)
{
   printf("I like B0B36PRP!\n");
   printf("I like B0B36PRP!\n");
   printf("I like B0B36PRP!\n");
   printf("I like B0B36PRP!\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 B0B36PRP!\n");
   }
   return 0;
}

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

clang program.c && ./a.out 

nebo

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

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

Vstup a výstup programu

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

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

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

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

Formátovaný výstup a standardní chybový výstup

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

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 B0B36PRP!\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 B0B36PRP!\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.

Procvičování formátovaného výstupu a vstupu

char c = 'a';
int i = 1000,j;
float x,y = 3.1415;
 
printf("%c\n", c);
printf("%i\n", c);
 
printf("%d\n", i);
printf("%+5d\n", i);
printf("%x\n", i);
 
printf("%f\n", y);
printf("%10.3f\n", y);
printf("\t%-g\n", y);

printf("%6d,%4d", 86, 1040);
printf("\n");
printf("%12.5e", 3.14159265);
printf("\r");
printf("%.4f\n", 85.167);

fprintf(stdout, "Standard output: %d\n", i);
fprintf(stderr, "Error output: %d\n", i);

./main >output.log 2>error.log

1-20.3-4.0e3

scanf("%d%d%f%f", &i, &j, &x, &y);

./main <input.log

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