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;