Wstęp do programowania 1 Argumenty funkcji main Bożena Woźna-Szcześniak bwozna@gmail.com Jan Długosz University, Poland Wykład 11
Argumenty funkcji main dwa równoważne sposoby int main(int argc, char* argv[]) int main(int argc, char** argv) Zawartość tablicy argv argv[0] wskaźnik do nazwy programu argv[1],..., argv[argc - 1] wskaźniki do kolejnych argumentów wywołania programu argv[argc] wskaźnik NULL
Zawartość tablicy argv - przykładowy program #include <stdio.h> int main(int argc, char* argv[]) { printf("ilosć argumentów programu = %d\n", argc); for (int k = 0; k < argc; ++k) { printf("%s\n", argv[k]); printf("%p\n", argv[argc]); return 0;
Przykładowy program - wykonanie./mojecho Ilość argumentów programu = 1./mojecho (nil)./mojecho Ala ma kota Ilość argumentów programu = 4./mojecho Ala ma kota (nil)
Przykładowy program - wykonanie./mojecho $PWD Ilość argumentów programu = 2./mojecho /home/bw/roboczy/wyklady/2008-2009/programowanie2/wp2w09 (nil)./mojecho $HOME ls Ilość argumentów programu = 3./mojecho /home/bw ls (nil)
Uproszczona implementacja polecenia systemowego echo #include <stdio.h> int main(int argc, char* argv[]) { for (int k = 1; k < argc; ++k) { printf("%s%s", argv[k], (k < argc - 1)? " " : ""); printf("\n"); return 0;
Przykładowy program - wykonanie./mojecho2./mojecho2 Ala ma kota Ala ma kota
Przykładowy program - wykonanie./mojecho2 $PWD /home/bw/roboczy/wyklady/2008-2009/programowanie2/wp2w09./mojecho2 $HOME ls /home/bw ls
Uproszczona implementacja polecenia systemowego echo - wersja nr 2 #include <stdio.h> int main(int argc, char** argv) { while (--argc) { printf("%s%s", *++argv, (argc > 1)? " " : ""); printf("\n"); return 0;
Sumowanie liczb całkowitych podanych jako argumenty wywołania programu #include <stdio.h> #include <stdlib.h> int main(int argc, char* argv[]) { if (argc < 2) { printf("uzycie: suma liczba1 liczba2...\n"); return 1; long s = 0; for (int k = 1; k < argc; ++k) { s += atoi(argv[k]); printf("suma podanych liczb = %ld\n", s); return 0;
Przykładowy program - wykonanie./suma Uzycie: suma liczba1 liczba2..../suma 1 2 3 Suma podanych liczb = 6./suma 1 2 30 Suma podanych liczb = 33
Wypisywanie nazw miesięcy, których odpowiednie reprezentacje całkowite podawane sa jako argumenty wywołania programu. #include <stdio.h> #include <stdlib.h> #include <string.h> char const* months(int nr); int main(int argc, char* argv[]) { for (int k = 1; k < argc; ++k) { printf("%s\n", months(atoi(argv[k]))); return 0; char const* months(int nr) { static char const* name[] = { "błędny miesiąc", "styczeń", "luty", "marzec", "kwiecień", "maj", "czerwiec", "lipiec", "sierpień", "wrzesień", "październik", "listopad", "grudzień" ; return (nr < 1 nr > 12)? name[0] : name[nr];
Przykładowy program - wykonanie./miesiace 1 styczeń./miesiace 2 3 luty marzec./miesiace 4 8 13 kwiecień sierpień błędny miesiąc
int getline(char* line, int maxlen); int getline(char* line, int maxlen) { if (fgets(line, maxlen, stdin)) return strlen(line); else return 0;
Symulacja programu grep #include <stdio.h> #include <string.h> #include <stdlib.h> int getline(char*, int); int main(int argc, char* argv[]) { const int MAX_LEN = 1024; char line[max_len]; int found = 0; if (argc!= 2) printf("format wywołania: smplgrep wzorzec\n"); else { while (getline(line, MAX_LEN) > 0) { if (strstr(line, argv[1])!= NULL) { printf("%s", line); ++found; return found;
Symulacja programu grep #include <stdio.h> #include <string.h> #include <stdlib.h> #include <stdbool.h> int getline(char*, int); int main(int argc, char* argv[]) { const int MAX_LEN=1024; char line[max_len]; int lineno = 0, c, found = 0; bool except = false, number = false; while (--argc > 0 && (*++argv)[0] == - ) { while ((c = *++argv[0])!= \0 ) { switch(c) { case x : except = true; break; case n : number = true; break; default : printf("grep: nieznana opcja %c\n", c); argc = 0; found = -1; break; //nastepny slajd
Symulacja programu grep - cd. if (argc!= 1) { printf("format wywołania: grep -x -n wzorzec\n"); else { while (getline(line, MAX_LEN) > 0) { ++lineno; if ((strstr(line, *argv)!= NULL)!= except) { if (number) printf("%7d:", lineno); printf("%s", line); ++found; return found;