• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

int main(int argc, char *argv[])

Object Storage Arubacloud
0 głosów
49,816 wizyt
pytanie zadane 29 listopada 2016 w C i C++ przez TheBatman94 Początkujący (450 p.)
Hej,

Bardzo was proszę o łopatologiczne wytłumaczenie co robi funkcja: int main(int argc, char *argv[])
Właściwie po co to ? Czy bez tych argumentów w nawiasie program mógłby normalnie funkcjonować ?

W jaki sposób zrozumieć o co tutaj chodzi ? Widzę, że jest tu wskaźnik, tablica i wiem tyle że jest to powiązane z konsolą, tylko tego zupełnie nie rozumiem :(

3 odpowiedzi

+10 głosów
odpowiedź 29 listopada 2016 przez Eryk Andrzejewski Mędrzec (164,260 p.)
edycja 1 grudnia 2016 przez Eryk Andrzejewski
 
Najlepsza

Tak, funkcja main bez argumentów jest też poprawna (jak słusznie zauważył shead, w języku C++. W języku C powinniśmy w takim wypadku napisać int main(void) - dzięki!).

Dzięki tym parametrom możesz sprawdzać z jakimi parametrami został wywołany program. Jeżeli np. ktoś wywołał z poziomu terminala lub konsoli twój program w taki sposób:

./program 1 siema 2

To w zmiennej argc wyląduje 4 - zerowym parametrem jest nazwa programu, i do tego jeszcze trzy dodatkowe.

Tablica argv ma taki rozmiar jaką wartość ma argc. Zerowym elementem tej tablicy jest nazwa programu, a kolejne elementy, od 1 zaczynając a na ostatnim kończąc to kolejne parametry wywołania programu.

Oto prosty programik (w języku C) który pokazuje jak z tego korzystać.

#include <stdio.h>
 
int main(int argc, char* argv[])
{
    printf("argc = %d\n", argc);
 
    for (int i = 0; i < argc; i++)
    {
         printf("argv[%d] = %s\n", i, argv[i]);
    }
}

Wywołanie tego kodu dla podanego wyżej przykładu wywołania dało taki efekt:

eryk@Ubuntu:~/test $ ./program 1 siema 2
argc = 4
argv[0] = ./program
argv[1] = 1
argv[2] = siema
argv[3] = 2

Pamiętaj tylko, że wszystkie elementy tej tablicy są zapisane jako char*, nawet parametry będące liczbami.

A co do samego char *argv[]

Ja preferuję nieco inny zapis, tzn char* argv[]. Teraz od razu widać że mamy do czynienia z tablicą - znaki [] elementów typu char* (wskaźników na char, a konkretnie wskaźników na pierwszy element [znak] łańcucha znaków), które są stosowane w języku C do "przechowywania" łańcuchów znaków (tak nie do końca przechowywania, gdyż to tylko wskaźniki)

P.S.

No i oczywiście, niekoniecznie takie nazwy muszą mieć te parametry. Jeżeli chcesz, zamiast argc możesz używać argumentsQuantity, a zamiast argv argumentsArray. Wszystko zależy od twojego gustu, chociaż przyjęło się żeby używać argc i argv, to może nie ma potrzeby robić przeciwko temu ;)

1
komentarz 1 grudnia 2016 przez niezalogowany

funkcja main bez argumentów jest też poprawna

należałoby dodać: "(...) jest poprawna w C++", bo w C jeżeli nie używamy argumentów powinno się napisać int main(void), o tym było też tutaj.

Jeszcze dodam, że istnieje jeszcze jedna wersja main, a więc:

int main(int argc, char** argv, char** envp)

Gdzie envp jest tablicą na zmienne środowiskowe 

komentarz 1 grudnia 2016 przez Eryk Andrzejewski Mędrzec (164,260 p.)

No tak, racja ;) Za momencik poprawię.

Od siebie dodam, że można oczywiście też użyć takiej wersji main():

int main(int argc)

 

komentarz 1 grudnia 2016 przez Patrycjerz Mędrzec (192,320 p.)
Można również dodać, że w Windowsie (nie wiem, jak w innych systemach) przesyłanie parametrów odbywa się również podczas opuszczenia pliku na ikonę danego programu - wtedy wysyłana jest ścieżka do niego.
+3 głosów
odpowiedź 29 listopada 2016 przez criss Mędrzec (172,590 p.)

Te dwa argumenty to sposób na przekazanie czegoś programowi przy jego uruchomieniu poprzez linie poleceń. Drugi argument to tablica napisów (wskaźników wskazujących na pierwszy element tablicy char-ów), a pierwszy to ilość tych napisów. Przy czym pierwszy napis (argv[0]) to nazwa programu.

Np.:

#include <iostream>

int main(int argc, char * argv[])
{
   if(argc >= 2)
      std::cout << "Hej " << argv[1];
}

Przy uruchomieniu w taki sposób:

name.exe Marek

Output:

Hej Marek 

 

0 głosów
odpowiedź 1 grudnia 2016 przez TheBatman94 Początkujący (450 p.)
Dzięki Panowie, teraz już jest jaśniej ! :)
komentarz 1 grudnia 2016 przez Eryk Andrzejewski Mędrzec (164,260 p.)

Cieszymy się smiley

Podobne pytania

–1 głos
1 odpowiedź 909 wizyt
pytanie zadane 27 grudnia 2018 w C i C++ przez Pandzia156 Nowicjusz (120 p.)
0 głosów
2 odpowiedzi 1,314 wizyt
–1 głos
1 odpowiedź 1,257 wizyt

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...