Wstep do programowania 1
Transkrypt
Wstep do programowania 1
Argumenty wywołania programu Wstep ˛ do programowania 1 Argumenty funkcji main Bożena Woźna-Szcześniak [email protected] Jan Długosz University, Poland Wykład 11 Argumenty wywołania programu 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 Argumenty wywołania programu 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; } Argumenty wywołania programu Przykładowy program - wykonanie [bw@wozna wp2w09]$ ./mojecho Ilość argumentów programu = 1 ./mojecho (nil) [bw@wozna wp2w09]$ [bw@wozna wp2w09]$ ./mojecho Ala ma kota Ilość argumentów programu = 4 ./mojecho Ala ma kota (nil) [bw@wozna wp2w09]$ Argumenty wywołania programu Przykładowy program - wykonanie [bw@wozna wp2w09]$ ./mojecho $PWD Ilość argumentów programu = 2 ./mojecho /home/bw/roboczy/wyklady/2008-2009/Programowanie2/wp2w09 (nil) [bw@wozna wp2w09]$ [bw@wozna wp2w09]$ ./mojecho $HOME ls Ilość argumentów programu = 3 ./mojecho /home/bw ls (nil) [bw@wozna wp2w09]$ Argumenty wywołania programu 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; } Argumenty wywołania programu Przykładowy program - wykonanie [bw@wozna wp2w09]$ ./mojecho2 [bw@wozna wp2w09]$ [bw@wozna wp2w09]$ ./mojecho2 Ala ma kota Ala ma kota [bw@wozna wp2w09]$ Argumenty wywołania programu Przykładowy program - wykonanie [bw@wozna wp2w09]$ ./mojecho2 $PWD /home/bw/roboczy/wyklady/2008-2009/Programowanie2/wp2w09 [bw@wozna wp2w09]$ [bw@wozna wp2w09]$ ./mojecho2 $HOME ls /home/bw ls [bw@wozna wp2w09]$ Argumenty wywołania programu 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; } Argumenty wywołania programu 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; } Argumenty wywołania programu Przykładowy program - wykonanie [bw@wozna wp2w09]$ ./suma Uzycie: suma liczba1 liczba2 ... [bw@wozna wp2w09]$ [bw@wozna wp2w09]$ ./suma 1 2 3 Suma podanych liczb = 6 [bw@wozna wp2w09]$ [bw@wozna wp2w09]$ ./suma 1 2 30 Suma podanych liczb = 33 [bw@wozna wp2w09]$ Argumenty wywołania programu Wypisywanie nazw miesiecy, ˛ 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ł˛ edny miesiac", ˛ "styczeń", "luty", "marzec", "kwiecień", "maj", "czerwiec", "lipiec", "sierpień", "wrzesień", "październik", "listopad", "grudzień" }; return (nr < 1 || nr > 12) ? name[0] : name[nr]; } Argumenty wywołania programu Przykładowy program - wykonanie [bw@wozna wp2w09]$ ./miesiace 1 styczeń [bw@wozna wp2w09]$ ./miesiace 2 3 luty marzec [bw@wozna wp2w09]$ ./miesiace 4 8 13 kwiecień sierpień bł˛ edny miesiac ˛ Argumenty wywołania programu int getline(char* line, int maxlen); int getline(char* line, int maxlen) { if (fgets(line, maxlen, stdin)) return strlen(line); else return 0; } Argumenty wywołania programu 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; } Argumenty wywołania programu 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 } Argumenty wywołania programu 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;