Преобразовать аргумент командной строки в строку
У меня есть программа, которая читает жестко закодированный путь к файлу, и я хочу вместо этого сделать так, чтобы он читал путь к файлу из командной строки. Для этого я изменил код следующим образом:
#include <iostream>
int main(char *argv[])
{
...
}
но, переменная argv[1]
, представленная таким образом, кажется, имеет указатель типа, и мне она нужна в виде строки. Что я должен сделать, чтобы преобразовать этот аргумент командной строки в строку?
Ответы
Ответ 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(" "));