Использование операторов if / then для разбора параметров argv [] в Stack Overflow

Как бы вы использовали оператор if / then, используя argv [], после ввода опции / параметра?

Например, a.out -d 1 sample.txt против a.out -e 1 sample.txt.

int main (int argc, char *argv[])
{
ifstream infile(argv[3]);

int c;
int number = 0;
int count = 0;

while ( infile.good() ) {

if (argv[1] == "-d")
{

c = infile.get();

number = atoi(argv[2]);

if (number == count)
{
cout.put(c);
count = 0;
}

else
count++;

}if (argv[1] == "-e")
{
cout << "entered -e" << endl;   //testing code
}}//end while

}//end main

3

Решение

Вы не можете использовать оператор равенства для сравнения строк в стиле C, вы должны использовать std::strcmp:

if (std::strcmp(argv[1], "-d") == 0)

Причиной этого является то, что == Оператор сравнивает указатели не то, на что они указывают.

2

Другие решения

Я надеюсь, что вы хотите проверить входной параметр -d или же , право?
если это так, пожалуйста, используйте strcmp ()

if (! strcmp (argv [1], «- d»))
{

            count++;
printf("\ncount=%d",count);

}

if (!strcmp(argv[1],"-e"))
{
printf("entered -e");   //testing code
}
1

Первая ошибка в самой первой строке main:

ifstream infile(argv[3]);

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

a.out -d 1 < sample.txt

тогда командная строка, которую видит программа, выглядит так:

argv[0] = "a.out"argv[1] = "-d"argv[2] = "1"

< sample.txtнапротив, интерпретируется оболочкой напрямую, а файл передается на стандартный ввод вашей программы — и вы ничего не можете сделать, чтобы изменить это внутри вашей программы.

Что касается самого анализа, не делайте этого внутри цикл, который читает файл, сделайте это раньше и установите соответствующие флаги.

Для фактического разбора я бы предложил использовать библиотеку, чтобы избавить вас от большой боли. Стандартный инструмент Unix getopt но у него есть только интерфейс C. Есть несколько библиотек C ++, среди них Boost.Program_Options что немного сложнее, на мой вкус, хотя.

1

Argc / argv происходит из C и довольно громоздок в использовании, поэтому, когда выполняется больше, чем просто передача аргументов, вы можете преобразовать аргументы в вектор строк и работать в стиле C ++:

#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>

main(int argc, char* argv[])
{
std::vector<std::string> args;
std::transform(argv+1, argv+argc, std::back_inserter(args), [](char* arg){ return std::string(arg); });

if (args.at(1) == "-d") { std::cout << "Arg 1 = -d" << "\n"; }

for (auto& arg: args) { std::cout << "arg: " << arg << "\n"; }
}

Тем не менее, вам нужно проверить, что аргумент присутствует. Если это базовый инструмент и допустимо, чтобы инструмент прерывался, когда параметр отсутствует, вы можете получить доступ к элементам args с помощью args.at(x) вместо args[x]

Или проверить этот ТАК вопрос для парсера аргумента.

1

голец argv [] является массивом char *
так

 if (string(argv[1]) == "-d")
0