char, int, float, double.
~/prp/lab02.
#include <stdio.h> int main(void) { printf("I like B0B36PRP!\n"); return 0; }
echo $?.
program0 a program1, které budou mít návratovou hodnotu 0 a 1. Využijte přepínač kompilátoru -o, např. kompilací clang program.c -o program0 a clang program.c -o program1.
./program0 && ./program1 ./program1 && ./program0a
./program0 && echo $? && ./program1 && echo $? ./program1 && echo $? && ./program0 && echo $?
a dále pak
./program0 && echo $? && ./program1; echo $? ./program1; echo $? && ./program0 && echo $?
#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
main s předáním argumentů programu, např.
#include <stdio.h> int main(int argc, char *argv[]) { for (int i = 0; i < argc; ++i) { printf("I like B0B36PRP!\n"); } return 0; }
./program
./program 1 2 3
./program a b c e
wc (viz man wc), například ./program 2 3 4 | wc.
getchar(), prostudujte si dokumentaci např. man getchar.
int r = getchar(); for (int i; i < r; ++i) { printf("I like B0B36PRP!\n"); }
enter.
1, nechte spočítat přesměrovaný výstup do programu wc, např. ./a.out | wc a konzultujte s ASCII tabulku.
r = r - '0'; a zkuste znovu program pro hodnoty 1 až 9.
echo 1 | ./program.
echo 3 > in.txt, který můžete zobrazit např. cat in.txt nebo otevřít v editoru gedit in.txt nebo přímo ve VS Code code in.txt.
./program < in.txt. Edituje obsah souboru in.txt.
touch empty.txt a vyzkoušejte chování program pro takový vstup.
return r < 0 || r > 9;
#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 $?
getchar()?printf, např. printf(“%d\n”, r);, viz man printf.
wc nebude 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 B0B36PRP!\n"); } fprintf(stderr, "%d\n", r); return r < 0 || r > 9; }
./program <in.txt | wc. Otestujte chování též pro záměnu stderr za stdout.
./program <in.txt >out.txt.
./program <in.txt 2>err.txt. Obsah souborů můžete zobrazit příkazem cat err.txt a obsah aktuálního pracovního adresáře např. ls -l.
scanf() (viz man scanf) včetně ošetření chyby načtení vstupu.
#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);
wc:
clang program.c && echo 4 | ./a.out | wc
stderr zprávu “ERROR: Out of range!\n” a program vrátí hodnotu 101.
if (n >= 0 && n <= 9) { ... } else { fprintf(stderr, "ERROR: Out of range!\n"); ret = 101; }
void print_line(int n); s následující definicí.
void print_line(int n) { for (int i = 0; i < n; ++i) { printf("I like B0B36PRP!\n"); } }
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.
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);
stdout) a standardní chybový výstup (stderr) funkcí fprintf.
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);
scanf na základě formátovacího řetězce, otestujte chování.
“%d/%d”.
./main <input.log
out.c, který vypíše na výstup zadaný počet řádku v rozsahu 0 až 100, kde výstup tvoří posloupnost čísel od 1 do n.
out a vyzkoušte přesměrování výstupu do jiného programu nebo souboru, např.
echo 10 | ./out echo 10 | ./out | wc echo 10 | ./out > output.txt cat output.txt wc output.txt
in, který očekává na vstupu posloupnost celých čísel a po přečtení vstupu vypíše počet načtených celých čísel
100 a 101 např.
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; }
in a vyzkoušejte interaktivní režim s ručním vkládáním vstupu
EOT (End-of-Transmission) Ctrl+D.
echo 10 | ./out > output.txt ./in < output.txt
out a in zkombinujte a ověřte jejich správné chování pro různé vstupy.
out upravte pro výpis celých čísel a to v podobě printf(“%d\n”, i); i printf(“%d ”, i);, kde i je řidící proměnná for cyklu.
echo 10 | ./out | ./in.