аргументы для функции main()

Рейтинг: 0Ответов: 1Опубликовано: 01.03.2023

До сегодняшнего дня писал программы на Си с таким применением функции main: int main(void). Но сегодня решил расширить свой кругозор и написал уже такую функцию: int main(int argc, char* argv[]). Тут передача аргументов согласно статье в которой я это вычитал работала как положено.

Я решил проверить как будет работать программа если я попытаюсь передать каждый аргумет по отдельности. Вот что получилось:

Мой код:

#include <stdio.h>

int main(int argc, char* first_arg, char* name, char* name1) {
    printf("Argument:\n%s\n%s\n%s", first_arg ,name, name);
    return 0;
}

Результат на вызов ./start.out некоторая строка здесь:

Argument:
~�&{�
��&{�
��&{�

Теперь то же самое только с массивами аргументов.

Мой код:

#include <stdio.h>

int main(int argc, char* first_arg[1], char* name[1], char* name1[1]) {
    printf("Argument:\n%s\n%s\n%s", first_arg[1] ,name[1], name[1]);
    return 0;
}

Результат на вызов ./start.out некоторая строка здесь:

Argument:
некоторая
SESSION_MANAGER=local/reiji-Legion-5-15IMH6:@/tmp/.ICE-unix/2497,unix/reiji-Legion-5-15IMH6:/tmp/.ICE-unix/2497
SESSION_MANAGER=local/reiji-Legion-5-15IMH6:@/tmp/.ICE-unix/2497,unix/reiji-Legion-5-15IMH6:/tmp/.ICE-unix/2497

Почему программа в формате char* argv[] принимает аргументы правильно, но если я разделю принятие аргументов на две отдельные переменные типа char* argv1 и char* argv2 - то аргументы я уже не получу?

Откуда берется SESSION_MANAGER=local/reiji-Legion-5-15IMH6:@/tmp/.ICE-unix/2497,unix/reiji-Legion-5-15IMH6:/tmp/.ICE-unix/2497 и что это вообще такое?

Как отлаживать подобного рода программы - ведь отладчик запускает отлаживаемую программу без аргументов?

Ответы

▲ 3Принят

Попробуйте позапускать с разными аргументами командной строки такую программку:

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

Это многое для вас прояснит... Передается массив указателей, а это совсем не то же самое, что набор параметров типа char*!

Фактически первый же вам аргумент оказывается указателем не на строку, а на массив указателей — этого достаточно, чтобы понять, что так, как вы, действовать нельзя?

А вообще в стандарте не указано, как именно должны передаваться аргументы в функцию, так что действуйте просто по уставустандарту, и все будет нормально работать. Кстати, совершенно не понимаю, зачем — чего вы хотите добиться таким способом, чем он лучше стандартного (если бы работал)?

Что до отладчика — то нормальный отладчик позволяет указать параметры командной строки...