Лекція 7. Параметри командного рядка
Ми використовували такі програми як make та clang, які приймають додаткові слова після своєї назви в командному рядку. Але насправді, наші програми також можуть приймати аргументи командного рядка.
У argv0.c, ми змінюємо вигляд нашої функції main:
#include <cs50.h>
#include <stdio.h>
int main(int argc, string argv[])
{
if (argc == 2)
{
printf("hello, %s\n", argv[1]);
}
else
{
printf("hello, world\n");
}
}
argc та argv - це дві змінні, які одержить функція main коли ми запустимо нашу програму з командного рядка. argcargc – це лічильник аргументів, тобто їх кількість, а argv - масив рядків, що є аргументами. Найперший аргумент, argv[0], буде назвою нашої програми (найперше надруковане слово, наприклад, ./hello). У цьому прикладі ми перевіримо, чи маємо ми два аргументи, і, якщо так, виведемо другий.
Ми можемо вивести кожен аргумент, один за одним:
#include <cs50.h>
#include <stdio.h>
int main(int argc, string argv[])
{
for (int i = 0; i < argc; i++)
{
printf("%s\n", argv[i]);
}
}
Ми також можемо вивести кожен символ кожного аргументу:
#include <cs50.h>
#include <stdio.h>
#include <string.h>
int main(int argc, string argv[])
{
for (int i = 0; i < argc; i++)
{
for (int j = 0, n = strlen(argv[i]); j < n; j++)
{
printf("%c\n", argv[i][j]);
}
printf("\n");
}
}
За допомогою argv[i], ми отримуємо поточний аргумент із масиву аргументів, а з argv[i][j], символ з цього рядка.
Таким чином, параметри командного рядка можуть виглядати десь так:
argc
|
argv
|
|
|
|
… |
argv це шматок пам’яті який зберігає один символьний рядок (string) за іншим, та argc це окрема комірка пам’яті що містить ціле число (int).
Ми маємо можливість доступу до кожного окремого рядка:
argc
|
argv[0] argv[1] argv[2] argv[3]
|
|
|
|
… |
Якщо ми виконуємо програму з параметром ./hello, комп’ютер зберігатиме це у argc та argv[0]:
argc
1 |
argv[0] argv[1] argv[2] argv[3]
./hello |
|
|
|
… |
У разі, коли ми виконуємо cd Dropbox пам’ять буде мати наступний вигляд:
argc
2 |
argv[0] argv[1] argv[2] argv[3]
cd |
Dropbox |
|
|
… |