1

Тема: Аргументи командного рядка

Всім привіт!
На першій співбесіді зіштовхнувся з питанням про аргументи командного рядка
Я маю загальне уявлення що це таке, та і як воно використовується
але питання яке мене поставило в ступор було: навіщо передавати argc, якщо стрічку можна розбити по пробілам, наприклад.

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

Якщо не складно розкрийте це питання більш детально

2

Re: Аргументи командного рядка

Можливо, щоб проконтролювати користувача, чи ввів він правильну кількість аргументів.

3

Re: Аргументи командного рядка

Це число ж ніколи явно не задається, воно автоматично визначається з кількості аргументів які ми передали

4

Re: Аргументи командного рядка

Яке це має значення? Так навіть краще: у вас є число параметрів, яке прийняла програма, а не яке, як вам здається, було передано (наприклад, коли ви ріжете рядок на параметри самостійно і визначаєте їх кількість).

Але я не знаю, сам намагаюсь вгадати.

5

Re: Аргументи командного рядка

int argc

це не просто число, а кількість аргументів що передаються в командному рядку, і хоч воно і ціле, але дуже зручне для виключних ситуацій для прикладу:

 if(argc!=2) {
    printf("Файл не відкрито, помилка.\n");
    exit(1);
  }

а

char* argv[]

є масивом покажчиком на масиви командного рядка, наприклад в argv[1] - назва програми, дальше все як запрограмується.

навіщо передавати argc, якщо стрічку можна розбити по пробілам

там не загальна йде стрічка, а адреса на певну стрічку, буде вільний час дам приклад з дізассемблерним кодом

Подякували: sensei, leofun012

6 Востаннє редагувалося koala (13.01.2016 20:07:10)

Re: Аргументи командного рядка

Бо:
- це традиційний системний інтерфейс, на аргументи команду розбиває система, зібрати їх назад буде зайвою працею;
- аргументи можуть містити пробіли, якщо їх брати в лапки або (в *NIX) ставити перед пробілами \.
Windows:

copy "my file.txt" "c:\My Documents"

*NIX:

cp my\ file.txt /home/me/diploma\ docs

Системи насправді дають можливість отримати і весь рядок повністю, але нащо, якщо він вже є розбитий?

Подякували: sensei, Yola, leofun013

7 Востаннє редагувалося -=ЮрА=- (14.01.2016 20:00:24)

Re: Аргументи командного рядка

sensei призначення argc ще тривіальніше ніж сказано вище - воно має на меті обмежити кількість ітерацій парсеру командної строки, уявімо собі що потрібна ініціалізація велкою кількістю рядків, число яких(рядків) може змінюватись, сатє питання коли стопнути ітераційний процесс прийому рядків(тобто який же рядок останній) - ось argc і підкаже коли.

Подякували: sensei, leofun012

8 Востаннє редагувалося P.Y. (27.08.2017 12:44:55)

Re: Аргументи командного рядка

Ще одна цікава фіча: замість аргументів з шаблоном пошуку файлів можуть автоматично підставлятись імена відповідних файлів. Наприклад, якщо в командному рядку буде введено myprogram *.txt, то в argv лежатимуть імена всіх файлів .txt з поточної директорії.

Наскільки я можу зрозуміти, в юнікс-подібних системах ця підстановка здійснюється оболонкою (?), тоді як у ДОС/Windows усі автоперетворення реалізуються засобами самої програми, тому підстановка імен файлів відбувається далеко не завжди (залежить від конкретного компілятора). У випадку програми на асемблері під віндою, їй просто передається необроблений рядок параметрів з усіма зайвими пробілами, а програма парсить його сама.

Подякували: sensei, koala, LoganRoss, leofun014

9

Re: Аргументи командного рядка

Так, MS Windows успадкувала алгоритм обробки параметрів від MS DOS, а той - від QDOS Тіма Патерсона, де QD розшифровується як "quick and dirty".