将命令行参数转换为字符串

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将命令行参数转换为字符串相关的知识,希望对你有一定的参考价值。

我有一个程序读取硬编码的文件路径,我想让它从命令行读取文件路径。为此我改变了这样的代码:

#include <iostream>

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

但是,argv[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文件。

另一答案

你可以创建一个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);
}
另一答案

无需赞成这一点。如果Benjamin Lindley将他的单行评论作为答案,那将是很酷的,但是既然他没有,那么这里是:

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

如果您不想包含argv[0],那么您不需要处理可执行文件的位置,只需将指针递增一:

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

另一答案

这很简单。这样做:

#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回答的那个。

另一答案
#include <iostream>

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

我不确定这是否是100%可移植的,但OS应该解析args的方式是扫描控制台命令字符串并在每个令牌的末尾插入一个nil-term char,而int main(int,char**)不使用const char**所以我们可以从第三个参数开始遍历args(@note第一个arg是工作目录)并向后扫描到nil-term char并将其转换为空格而不是从第二个参数的开头开始并向前扫描到了无名的char。这是带有测试脚本的函数,如果你确实需要un-nil-ify多个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 << "

Testing ArgsToString...
";

  if (args_count <= 1) return 1;
  cout << "
Arguments:
";
  for (int i = 0; i < args_count; ++i) {
    char* arg = args[i];
    printf("
i:%i"%s" 0x%p", i, arg, arg);
  }
  cout << "

Contiguous Args:
";
  char* end = args[args_count - 1];
  while (*end) ++end;
  cout << "

Contiguous Args:
";
  char* cursor = args[0];
  while (cursor != end) {
    char c = *cursor++;
    if (c == 0)
      cout << '`';
    else if (c < ' ')
      cout << '~';
    else
      cout << c;
  }
  cout << "

Printing argument string...
";
  _::ArgsToString(args_count, args);
  cout << "
" << args[1];
  return 0;
}

以上是关于将命令行参数转换为字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何将命令行参数转换为 int?

将命令行参数转换为 Bash 中的数组

如何将命令行“key=value”参数转换为字典?

从命令行参数 C 将十六进制转换为二进制

Ghostscript将pdf转换为pdf命令行参数不起作用

片段(Java) | 机试题+算法思路+考点+代码解析 2023