Dalam banyak C ++ IDE dan kompiler, ketika menghasilkan fungsi utama untuk Anda, tampilannya seperti ini:
int main(int argc, char *argv[])
Ketika saya kode C ++ tanpa IDE, hanya dengan kompiler baris perintah, saya ketik:
int main()
tanpa parameter apa pun. Apa artinya ini, dan apakah ini penting untuk program saya?
c++
parameters
command-line-arguments
argv
argc
Greg Treleaven
sumber
sumber
int main(int argc, char* argv[], char* envp[])
dan mencetak argumen terakhir.;)
system()
panggilan, permintaan DB, dll. Seperti biasa dengan input pengguna.char **envp
argumen?Jawaban:
argv
danargc
bagaimana argumen baris perintah dilewatkan kemain()
dalam C dan C ++.argc
akan menjadi jumlah string yang ditunjukkan olehargv
. Ini akan (dalam praktiknya) menjadi 1 ditambah jumlah argumen, karena hampir semua implementasi akan menambahkan nama program ke array.Variabel dinamai
argc
( jumlah argumen ) danargv
( argumen vektor ) oleh konvensi, tetapi mereka dapat diberi pengidentifikasi yang valid:int main(int num_args, char** arg_strings)
sama-sama valid.Mereka juga dapat dihilangkan seluruhnya, menghasilkan
int main()
, jika Anda tidak berniat untuk memproses argumen baris perintah.Coba program berikut ini:
Menjalankannya dengan
./test a1 b2 c3
kemauan outputsumber
argc
bisa 0, dalam halargv
ini bisa NULL. Itu diizinkan oleh AFAIK standar. Saya belum pernah mendengar tentang sistem yang melakukan hal ini dalam praktiknya, tetapi tentu saja bisa ada dan tidak akan melanggar standar apa pun.argv[argc]
harus 0" (C ++ 03 §3.6.1 / 2),argv
tidak boleh nol.*NULL
jelas tidak sama denganNULL
.argc
adalah jumlah argumen yang diteruskan ke program Anda dari baris perintah danargv
merupakan array argumen.Anda dapat mengulang argumen dengan mengetahui jumlah dari mereka seperti:
sumber
Misalkan Anda menjalankan program Anda dengan demikian (menggunakan
sh
sintaks):Jika Anda menyatakan utama sebagai
int main(int argc, char *argv[])
, maka (di sebagian besar lingkungan), Andamain()
akan dipanggil seolah-olah seperti:Namun, jika Anda menyatakan utama Anda sebagai
int main()
, itu akan disebut sesuatu sepertidan Anda tidak mendapatkan argumen yang lulus.
Dua hal tambahan yang perlu diperhatikan:
main
. Jika platform tertentu menerima argumen tambahan atau tipe pengembalian yang berbeda, maka itu merupakan ekstensi dan tidak boleh diandalkan dalam program portabel.*argv[]
dan**argv
persis sama, sehingga Anda dapat menulisint main(int argc, char *argv[])
sebagaiint main(int argc, char **argv)
.sumber
basic.start.main/2
secara eksplisit memungkinkan versi tambahan yang ditentukan implementasimain()
, asalkan implementasi menyediakan dua versi yang telah ditentukan. Jadi, mereka tidak sepenuhnya tidak sesuai. Yang paling umum adalahenvp
, yang begitu terkenal di kedua C dan C ++ yang secara harfiah entri pertama di bagian J.5 (ekstensi umum) dari standar C .Parameter untuk
main
mewakili parameter baris perintah yang disediakan untuk program ketika dimulai. Theargc
parameter mewakili jumlah argumen baris perintah, danchar *argv[]
adalah array dari string (karakter pointer) mewakili argumen individu yang disediakan di baris perintah.sumber
argv[0]
apa pun program yang meluncurkan program C memberikannyaargv[0]
. Dalam kasus Bash, seringkali (mungkin selalu) pathname dari executable, tetapi Bash bukan satu-satunya program yang mengeksekusi program lain. Hal ini permissisble, meskipun eksentrik, untuk menggunakan:char *args[] = { "cat", "/dev/null", "/etc/passwd", 0 }; execv("/bin/ls", args);
. Pada banyak sistem, nilai yang dilihat oleh programargv[0]
akan seperti itucat
, meskipun dieksekusi/bin/ls
.The
main
Fungsi dapat memiliki dua parameter,argc
danargv
.argc
adalahint
parameter integer ( ), dan itu adalah jumlah argumen yang diteruskan ke program.Nama program selalu merupakan argumen pertama, sehingga akan ada setidaknya satu argumen untuk suatu program dan nilai minimum
argc
akan menjadi satu. Tetapi jika suatu program memiliki dua argumen, nilainyaargc
akan menjadi tiga.Parameter
argv
menunjuk ke array string dan disebut vektor argumen . Ini adalah array string satu dimensi dari argumen fungsi.sumber
Ini adalah deklarasi sederhana. Tidak dapat mengambil argumen baris perintah.
Deklarasi ini digunakan ketika program Anda harus mengambil argumen baris perintah. Ketika dijalankan seperti itu:
argc
, atau Jumlah Argumen, akan ditetapkan ke 4 (empat argumen), danargv
, atau Vektor Argumen, akan diisi dengan pointer string ke "myprogram", "arg1", "arg2", dan "arg3". Doa program (myprogram
) termasuk dalam argumen!Atau, Anda dapat menggunakan:
Ini juga valid.
Ada parameter lain yang dapat Anda tambahkan:
The
envp
parameter juga mengandung variabel lingkungan. Setiap entri mengikuti format ini:seperti ini:
Daftar variabel lingkungan diakhiri null.
PENTING: JANGAN menggunakan nilai apa pun
argv
atauenvp
langsung dalam panggilan kesystem()
! Ini adalah lubang keamanan besar karena pengguna jahat dapat mengatur variabel lingkungan ke perintah baris perintah dan (berpotensi) menyebabkan kerusakan besar. Secara umum, jangan gunakansystem()
. Hampir selalu ada solusi yang lebih baik diimplementasikan melalui perpustakaan C.sumber
Parameter pertama adalah jumlah argumen yang disediakan dan parameter kedua adalah daftar string yang mewakili argumen tersebut.
sumber
Keduanya
adalah definisi hukum dari titik masuk untuk program C atau C ++. Stroustrup: C ++ FAQ Gaya dan Teknik merinci beberapa variasi yang mungkin atau legal untuk fungsi utama Anda.
sumber
int main()
==>int main(void)
... untuk kompatibilitas dan keterbacaan. Saya tidak tahu apakah semua versi C yang lebih lama memungkinkan fungsi void memiliki daftar parameter kosong dalam deklarasi.void
diperlukan. Jangan mengutip saya tentang itu, dan saya sekarang tahu itu adalah komentar yang agak bodoh. Tidak ada ruginya.