CVIČENIE 5/13 (SW2) Programovane v jazyku C - davaj argumenty About odovzdavane parametrov z prkazoveho radku Basc knowledge argument prkazoveho radku - argumenty nasledujuce za samotnym prkazom ls -la /home/mrek argumentm je v tomto prpade vsetko za samotnym prkazom ls mechanzmus odovzdavana argumentov/parametrov z prkazoveho radku sa v C deje pomocou dvoch argumentov funkce man. nt man( nt argc, char *argv[] ) argc predstavuje pocet argumentov spolu s nazvom daneho programu argv predstavuje smernk na pole retazcov predstavujucch jednotlve argumenty, kde argv[0] predstavuje nazov samotneho programu. pre nas prklad uvedeny vysse by bol obsah jednotlvych premennych takyto: $ ls -la /home/mrek > argc = 3 > argv[0] = "ls", argv[1] = "-la", argv[2] = "/home/mrek"
TODO: ARGV a ARGC - argv... ukazatel na pole ponterů na jednotlvé parametry - argc... počet parametrů Prklad: - spuštění programu: myprog.exe 2 d2 8 5 - v programu: nt man(nt argc, char** argv) {... *argv argv[0] argv 0 argc 5 argv[3] 5 \0 8 \0 d argv[3][1] m y p r o g. e x e \0 **argv *argv[0] argv[0][0]
nt man(nt argc, char** argv) { argv++; - stuace po provedení příkazu argv++ *argv argv[0] argv 0 argc 5 5 \0 8 \0 d **argv m y p r o g. e x e \0 Prklad: vypsání parametrů programu nt man(nt argc, char** argv) { whle (*argv){ prntf( %s\n,*argv); argv++; return 0; Prklad: kalkulačka s +/- - načíst z příkazové řádky buď +/- nebo číslo - po zpracování celé příkazové řádky vypsat výsledek - převod řetězce na čísla pomocí ato pokus.exe 1 + 12 1 10 + 1
- složtější verze by měla zvládnout ošetřt dvné vstupy a musí umět pracovat s: - převod řetězce na čísla pomocí strtod/strtol pokus.exe 1 + -12 +1 10 + 1 nt man(nt argc, char* argv[]){ char* p; nt cslo; nt vysledek = 0; nt op = 1; nt = 1; nt c; whle ( < argc){ c = argv[][0]; // prvn znak -teho retezce f ((c=='+' c=='-') ) { // je to znamenko f (argv[][1] == '\0') {// za znamenkem je mezera -> OK f (op == 0) { // pred znamenkem bylo nejake cslo f (c=='+') op = 1; else op = 2; else { // za znamenkem nen mezera -> znamenko a cslo prntf("\npred znamenkem nebylo cslo.\n"); else { // za znamenkem nen mezera -> je tam cslo cslo = strtod(argv[],&p); f (*p){ prntf("\nza cslem je bordel.\n"); f (op > 0) { f (op == 1) vysledek = vysledek + cslo; f (op == 2) vysledek = vysledek - cslo; op = 0;
else { // pred cslem nebylo znamenko -> chyba prntf("\npred cslem nebylo znamenko(1).\n"); else { // prvn znak je cslo cslo = strtod(argv[],&p); f (*p){ prntf("\nza cslem je bordel.\n"); f (op > 0) { f (op == 1) vysledek = vysledek + cslo; f (op == 2) vysledek = vysledek - cslo; op = 0; else { // pred cslem nebylo znamenko -> chyba prntf("\npred cslem nebylo znamenko(2).\n"); ++; prntf ("\n\nvysledek %d ",vysledek); return 0; Examples Ex. 1: vytvorte program, ktory vypse na obrazovku Hello name!, kde name sa odovzda ako argument z prkazoveho radku pr spusten programu. #nclude <stdo.h> nt man( nt argc, char *argv[] )
{ // v tomto jednom radku bude nas vysledok ;) return( 0 ); Ex. 2: upravte predchadzajuc program tak, aby: 1. ak nebol zadany zadny argument, vypsal na obrazovku: Nemam koho pozdravt :( 2. ak bolo zadanych vac ako jeden argument, vypse sa na obrazovku: Nevem, koho mam pozdravt :( 3. pokal je jeden argument, vypse sa na obrazovku: Hello name!, kde name bude prave tento argument Samozrejme - sa uvazuje pocet argumentov za samotnym nazvom programu. Ex. 3: vytvorte program, ktory zo vstupu nacta postupnost csel a vypse ch sucet. pre konverzu csel z retazca do ntegeru pouzte funkcu ato z knznce stdlb.h. $ sucet 1 2 3 4 5 6 Sucet je: 21 Ex. 4: vytvorte program, ktoreho argumentom prkazoveho radku bude lubovolne dlhy text. z tohto textu zst a vypse na obrazovku, kolko slov tohto textu predstavuju csla (teda retazce zostavene len z cslc). Prklad: $ fnder ahoj bezdeda. dnes som uz stary mladenec, lebo uz mam 25 rokov.\ tak s vaz tych svojch 18. pocet csel v texte: 2 Homework Vytvorte program, ktory dostane ako vstupny parameter cslo. Vystupom bude jeho slovna reprezentaca. Teda: $ convert 147 stostyrdsatsedem V prpade problemov so slovencnou mozete pouzt anglctnu ;) $ convert 147 onehundredfortyseven