我有一个读取硬编码文件路径的程序,我想让它从命令行读取文件路径。为此我改变了代码:
#include <iostream>
int main(char *argv[])
{
...
}
但是,以这种方式公开的argv[1]
变量似乎是类型指针,我需要它作为字符串。如何将此命令行参数转换为字符串?
答案 0 :(得分:26)
它已经是一个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文件。
答案 1 :(得分:17)
您可以创建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);
}
答案 2 :(得分:3)
无需支持这一点。如果Benjamin Lindley将他的单行评论作为答案,那会很酷,但是既然他没有,那么这就是:
std::vector<std::string> argList(argv, argv + argc);
如果您不想包含argv[0]
,那么您不需要处理可执行文件的位置,只需将指针递增1:
std::vector<std::string> argList(argv + 1, argv + argc);
答案 3 :(得分:1)
由于所有尝试打印我放置在变量中的参数的尝试均失败,因此我在此问题中的2个字节为
std::string dump_name;
(stuff..)
if(argc>2)
{
dump_name.assign(argv[2]);
fprintf(stdout, "ARGUMENT %s", dump_name.c_str());
}
请注意分配的使用,以及c_str()函数调用的需要。
答案 4 :(得分:0)
这很简单。就这样做:
#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]
}
@Benjamin Lindley你是对的。这不是一个好的解决方案。请阅读juanchopanza回答的那个。
答案 5 :(得分:0)
#include <iostream>
std::string commandLineStr= "";
for (int i=1;i<argc;i++) commandLineStr.append(std::string(argv[i]).append(" "));
答案 6 :(得分:0)
我不确定这是否是100%可移植的,但是操作系统 SHOULD 解析args的方式是扫描控制台命令字符串并在每个末尾插入nil-term char令牌,并且int main(int,char**)
不使用const char**
,因此我们可以从第三个参数( @note 第一个arg是工作目录)开始遍历args并进行扫描向后移到nil-term char并将其变成一个空格,而不是从第二个参数的开头开始并向前扫描到nil-term char。这是带有测试脚本的函数,如果您确实需要取消零个以上的nil-term char,则请发表评论,以便我进行修复;谢谢。
#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;
}