C programming для начинающих: часть 2 – аргументы и возвращаемые значения

 

Первая часть

В прерыдущем примере мы использовали очень простую программу:

#include <stdio.h>

main () {
    printf("Hello, world\n");
}

Код завершения

Давайте дополним её код:

#include <stdio.h>

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

    printf("Hello, world\n");
    return 0;

}

Компилируем, проверяем:

gcc hello2.c -o hello2
./hello2
Hello, world

Первая строка у нас остаётся без изменений – тот же шебанг с командой для препроцессора, которая указывает ему загрузить файл stdio.h перед тем, как передавать код на обработку компилятору:

#include <stdio.h>

А вот описание функции main() выглядит иначе – тут мы указываем int перед именем функции:

...
int main ()
...

Что означает, что фукнция main() вернёт целочисленное значение (мы рассмотрим типы данных в С позже):

...
return 0;
...

В С – каждая функция возращает какое-то значение, тип которого и указывается перед именем функции.

Т.к. main() у нас возвращает 0 (return 0) – то и тип возвращаемого значения мы указываем int (integer):

...
int main ()
...

В результате – если программа (функция) завершает выполнение успешно – она вернёт 0, в противном случае – любое другое значение, которое будет сигнализировать об ошибке во время выполнения.

Проверить код завершения выполнения можно с помощью $?:

./hello2
Hello, world
echo $?

Например – можно изменить код на:

...
    printf("Hello, world\n");
    return -1;
...

Компилируем и проверяем:

./hello2 && echo OK: $? || echo ERROR: $?
Hello, world
ERROR: 255

Примечание: в ответе значение 255, а не -1 – т.к. bash и POSIX стандарт используют в ошибке беззнаковые значения от 1 до 255, а -1 в двоичном равно 11111111, что в десятичном == 255.

Аргументы

Далее – функция main() может принимать два аргумента:

...
... (int argc, char **argv)
...

Первый аргумент – argc – имеет тот же тип integer, и содержит в себе количество аргументов, переданных функции или программе.

Второй аргумент – argv – является указателем (мы обсудим их далее) на charachter (символьный) массив данных.

Его так же можно записать как char *argv[].

Быстро проверим – выведем значения argc и argv на экран с помощь printf() – усложним программу:

#include <stdio.h>

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

    printf("Hello, world\n");
    printf("Argc: %d\n", argc);

    int i;
    for (i = 0; i < argc; i++) {
        printf("Argv[%d]: %s\n", i, argv[i]);
    }

    return 0;

}

Результат её выполнения:

./hello2 one two three
Hello, world
Argc: 4
Argv[0]: ./hello2
Argv[1]: one
Argv[2]: two
Argv[3]: three

Т.е. – argc содержит число 4 – кол-во аргументов вообще (включая имя программы), а argv – содержит все аргументы, переданные программме, включая её имя в первом элементе массива (argv[0]).

Продолжение – C programming для начинающих: часть 3 – передача аргументов программе.