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

Преобразовать аргумент командной строки в строку

У меня есть программа, которая читает жестко закодированный путь к файлу, и я хочу вместо этого сделать так, чтобы он читал путь к файлу из командной строки. Для этого я изменил код следующим образом:

#include <iostream>

int main(char *argv[])
{
...
}

но, переменная argv[1], представленная таким образом, кажется, имеет указатель типа, и мне она нужна в виде строки. Что я должен сделать, чтобы преобразовать этот аргумент командной строки в строку?

4b9b3361

Ответ 1

Это уже массив строк в стиле C:

#include <iostream>
#include <string>
#include <vector>


int main(int argc, char *argv[]) // Don't forget first integral argument 'argc'
{
  std::string current_exec_name = argv[0]; // Name of the current exec program
  std::string first_arge;
  std::vector<std::string> all_args;

  if (argc > 1) {

    first_arge = argv[1];

    all_args.assign(argv + 1, argv + argc);
  }
}

Аргумент argc - это количество аргументов плюс текущий файл exec.

Ответ 2

Вы можете создать std::string

#include <string>
#include <vector>
int main(int argc, char *argv[])
{
  // check if there is more than one argument and use the second one
  //  (the first argument is the executable)
  if (argc > 1)
  {
    std::string arg1(argv[1]);
    // do stuff with arg1
  }

  // Or, copy all arguments into a container of strings
  std::vector<std::string> allArgs(argv, argv + argc);
}

Ответ 3

Нет необходимости, чтобы поддержать это. Было бы здорово, если бы Бенджамин Линдли дал свой однострочный комментарий в качестве ответа, но так как он этого не сделал, вот так:

std::vector<std::string> argList(argv, argv + argc);

Если вы не хотите включать argv[0] и вам не нужно иметь дело с исполняемым местоположением, просто увеличьте указатель на единицу:

std::vector<std::string> argList(argv + 1, argv + argc);

Ответ 4

Я не уверен, что это на 100% переносимо, но способ, которым ОС ДОЛЖНА анализировать аргументы, заключается в сканировании командной строки консоли и вставке символа nil-term char в конце каждого токена, и int main(int,char**) не использует const char**, поэтому мы можем просто выполнить итерации по аргументам, начиная с третьего аргумента (@note первый аргумент - это рабочий каталог), и отсканировать назад к nil-term char и повернуть его в пробел, а не начинать с начала второго аргумента и сканирования вперед до нулевого символа char. Вот функция с тестовым скриптом, и если вам нужно отменить nil-ify более чем на один термин с нулевым термином, пожалуйста, прокомментируйте, чтобы я мог это исправить; спасибо.

#include <cstdio>
#include <iostream>

using namespace std;

namespace _ {
/* Converts int main(int,char**) arguments back into a string.
@return false if there are no args to convert.
@param arg_count The number of arguments.
@param args      The arguments. */
bool ArgsToString(int args_count, char** args) {
  if (args_count <= 1) return false;
  if (args_count == 2) return true;
  for (int i = 2; i < args_count; ++i) {
    char* cursor = args[i];
    while (*cursor) --cursor;
    *cursor = ' ';
  }
  return true;
}
}  // namespace _

int main(int args_count, char** args) {
  cout << "\n\nTesting ArgsToString...\n";

  if (args_count <= 1) return 1;
  cout << "\nArguments:\n";
  for (int i = 0; i < args_count; ++i) {
    char* arg = args[i];
    printf("\ni:%i\"%s\" 0x%p", i, arg, arg);
  }
  cout << "\n\nContiguous Args:\n";
  char* end = args[args_count - 1];
  while (*end) ++end;
  cout << "\n\nContiguous Args:\n";
  char* cursor = args[0];
  while (cursor != end) {
    char c = *cursor++;
    if (c == 0)
      cout << ''';
    else if (c < ' ')
      cout << '~';
    else
      cout << c;
  }
  cout << "\n\nPrinting argument string...\n";
  _::ArgsToString(args_count, args);
  cout << "\n" << args[1];
  return 0;
}

Ответ 5

Поскольку все попытки напечатать аргумент, который я поместил в мою переменную, потерпели неудачу, вот мои 2 байта для этого вопроса:

std::string dump_name;

(stuff..)

if(argc>2)
{
    dump_name.assign(argv[2]);
    fprintf(stdout, "ARGUMENT %s", dump_name.c_str());
}

Обратите внимание на использование assign, а также на необходимость вызова функции c_str().

Ответ 6

Это просто. Просто сделайте следующее:

#include <iostream>
#include <vector>
#include <string.h>

int main(int argc, char *argv[])
{
    std::vector<std::string> argList;
    for(int i=0;i<argc;i++)
        argList.push_back(argv[i]);
    //now you can access argList[n]
}

@Бенджамин Линдли. Вы правы. Это нехорошее решение. Пожалуйста, прочитайте ответ, полученный от juanchopanza.

Ответ 7

#include <iostream>

std::string commandLineStr= "";
for (int i=1;i<argc;i++) commandLineStr.append(std::string(argv[i]).append(" "));