C ++, командная строка, параметры - PullRequest
1 голос
/ 11 марта 2011

Я запускаю свою программу на С ++ из командной строки:

program input_file1 input_file2 output_file

, где

int main( int argc, char *argv[] )
{
    short indicator= 3;
    char input_file1[4096], input_file2[4096], output_file[4096];
    char *p_file = NULL;
    while ( --argc > 0 ) {
        switch (--indicator) {
          case 2:
            p_file = output_file;
            break;
          case 1:
            p_file = input_file2;
            break;
          case 0:
            p_file = input_file1;
            break;
        }

        for (char *argument = argv[argc]; ; ++argument) {
            if (*argument == '\0')
                break;
            else
                *p_file++ = *argument;
        }

        *p_file = '\0'; 
    }

    std::cout << input_file1 << '\n';
    std::cout << input_file2 << '\n';
    std::cout << output_file << '\n';
}

Но с реальными аргументами

program D:\\data\\file1.txt D:\\data\\file2.txt D:\\data\\file3.txt

в именахВ файлах хранится только первая буква D ...

Output:
D
D
D

Спасибо за помощь ...

Ответы [ 5 ]

9 голосов
/ 11 марта 2011

Хорошо, вот короткая версия:

int main(int argc, char *argv[]) {
    if (argc != 2) {
        std::cout << "This program requires 1 argument!" << std::endl;
        return 1;
    }
    std::string input_file(argv[1]);
    std::cout << input_file << std::endl;
}

Вы можете взять ее отсюда.

7 голосов
/ 11 марта 2011

Это проблема C, а не C ++, но поскольку она помечена как C ++, я предложу решение C ++ для вашей проблемы:

int main( int argc, char *argv[] ) {
     std::vector<std::string> args(argv+1, argv+argc);
     std::cout << args[0] << '\n' << args[1] << '\n' << args[2] << std::endl;
}

ОБНОВЛЕНИЕ использование итераторов в argv для заполнения векторных аргументов (спасибо Space_C0wb0y)

4 голосов
/ 11 марта 2011

Вместо того, чтобы копировать аргументы, просто установите имена файлов так, чтобы они указывали на соответствующую запись в argv.

int main(int argc, char *argv[]) {
    char *input_file1, *input_file2, *output_file; 

    if (4 > argc)
    {
        std::cout << "Not enough parameters\n";
        return -1;
    }
    input_file1 = argv[1];
    input_file2 = argv[2];
    output_file = argv[3];

    std::cout << input_file1 << '\n';
    std::cout << input_file2 << '\n';
    std::cout << output_file << '\n'; 
}

содержимое argv будет существовать до тех пор, пока программа работает.

2 голосов
/ 11 марта 2011
*p_file ++ = * argument; 

Это присваивает первый символ аргумента первому символу в p_file.

Вам нужно использовать strcpy или объявить некоторые std::strings вместо массивов char

0 голосов
/ 26 июля 2018

У вас все неправильно.Вы перебираете символы, а не массив параметров.Вы можете сделать это следующим образом:

for(auto arg = argv + 1; *arg; ++arg)
{
    std::cout << (*arg) << '\n'; // *arg is a char*
}

Это работает, потому что аргументы (если таковые имеются) начинаются с argv + 1 и потому что они имеют нулевое окончание , так что *arg равно nullptr (преобразуется в false) в конце массива аргументов.

Ваши аргументы получаются путем разыменования arg с использованием *arg, что является char*.

Так что выможно сделать:

if(!std::strcmp(*arg, "--help"))
    print_help_info();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...