Search
Výchozí soubory prg-lab03.zip (Pokročilé úkoly)
Implementujte program, který přečte ze standardního vstupu celé číslo, které by mělo být v rozsahu 1 až 10 a vytiskne následující trojúhelník, např. pro n=4.
**** *** ** *
Při implementaci funkční program postupně rošiřujte o ošetření chybných vstupů, reportování chyb, případně dekompozici tisknutí trojúhelníku na tisknutí řádků, např. v následujících krocích.
scanf()
putchar('*')
putchar('\n')
clang main.c && echo “1” | ./a.out ; echo $?
man scanf
touch in.txt; ./a.out < in.txt
CTRL+D
100
101
“ERROR: Cannot read integer value from the standard input\n”
“ERROR: Given value %d is not within the range [1, 10]\n”
MIN_VALUE
MAX_VALUE
clang -DMAX_VALUE=100
void print_triangle(char c, int lines);
void print_line(char c, int n);
int read_input(int *n);
int print_error(int ret, int n);
stderr
fprintf()
./main <input > out.std 2> out.err
argc
argv
sscanf()
-g
#include <stdio.h> int main(int argc, char *argv[]) { int arr[5] = { 1, 2, 3, 4, 5 }; for (int i = 0; i < 30; ++i){ printf("%d: %d\n", i, arr[i]); } return 0; }
echo $?
valgrind ./prog 2>log
log
gdb
run
bt
gdb ./prog
(gdb) run (gdb) bt
#include <stdio.h> static int arr[5] = { 1, 2, 3, 4, 5 }; static void endless(int size) { for (int i = 0; i < size; ++i) printf(" %d", arr[i]); printf("\n"); endless(size * 10); } int main(int argc, char *argv[]) { endless(1); return 0; }
a()
#include <limits.h> static int a(int i); static int b(int i); static int c(int i); static int d(int i); static int a(int i) { int shift = sizeof(int) * 8 - 1; if ((i & (0x1 << shift)) == INT_MIN){ return i + a(0); }else if (i % 2 == 0){ return a(i + 1) - 1; }else{ return i + b(i) / 2; } } static int b(int i) { if ((i & 0x1) == 0){ return d(i); }else{ return c(i - 1); } } static int c(int i) { int j = i / 2; if (i == 0){ return 2; }else{ return b(j); } } static int d(int i) { int ip = i + 1; int im = i - 1; if (i == 1) return ip; return b(im); } int main(int argc, char *argv[]) { ... }
cgdb
run -- spustí běh break [název funkce nebo číslo řádku] -- nastaví breakpoint tbreak [název funkce nebo číslo řádku] -- nastaví jednorázový breakpoint clear [název funkce nebo číslo řádku] -- smaže breakpoint info break -- zobrazí seznam breakpointů step -- provede jeden krok program (zkratka s) step [počet kroků] -- provede uvedený počet kroků programu display [výraz] -- nastaví výraz, který se vypíše při každém zastavení backtrace -- vypíšte backtrace frame -- zobrazí rámec up [počet rámců] -- posune program o počet rámců zpět down [počet rámců] -- posune program o počet rámců dopředu info locals -- zobrazí lokální proměnné info args -- zobrazí argumenty rámce info variables -- zobrazí všechny statické a globální proměnné
lec03/main_env.c
int main(int argc, char **argv, char **envp)