аргументы для функции main()
До сегодняшнего дня писал программы на Си с таким применением функции 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 и что это вообще такое?
Как отлаживать подобного рода программы - ведь отладчик запускает отлаживаемую программу без аргументов?
Ответы (1 шт):
Попробуйте позапускать с разными аргументами командной строки такую программку:
int main(int argc, char* argv[])
{
for(int i = 0; i < argc; ++i)
printf("Argument %d: %s\n", i ,argv[i]);
}
Это многое для вас прояснит... Передается массив указателей, а это совсем не то же самое, что набор параметров типа char*!
Фактически первый же вам аргумент оказывается указателем не на строку, а на массив указателей — этого достаточно, чтобы понять, что так, как вы, действовать нельзя?
А вообще в стандарте не указано, как именно должны передаваться аргументы в функцию, так что действуйте просто по уставустандарту, и все будет нормально работать. Кстати, совершенно не понимаю, зачем — чего вы хотите добиться таким способом, чем он лучше стандартного (если бы работал)?
Что до отладчика — то нормальный отладчик позволяет указать параметры командной строки...