以不同的方式接收命令行输入

taking command line input in different ways

本文关键字:命令行 输入 方式接      更新时间:2023-10-16

如果不使用下面的结构,如何接受命令行参数?

 int main ( int argc, char* argv ) {
 }

我的问题是:我怎样才能接受下面的输入?

 ./executableProgramName   inputX inputY inputZ inputT

在任何函数中

in foo () {
 // what should I write so that I can get same effect 
}
    有其他的方式来接受命令行输入吗?

标准指定的获取命令行参数的方法是传递给入口点函数main的argc和argv参数。没有其他的标准方法。

一些平台提供非标准的方法。例如,如果你在Windows上,你可以使用GetCommandLineW

下面的例子也使用了一些c++ 11的东西。

#include <ShellAPI.h> // for CommandLineToArgvW
#include <string>
#include <vector>
#include <codecvt>
#include <locale>
int main() {
#ifdef WIN32
    LPWSTR *szArglist;
    int argc;
    szArglist = CommandLineToArgvW(GetCommandLineW(),&argc);
    if(NULL==szArglist) {
       std::cerr << "CommandLineToArgvW failedn";
    }
    std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>,wchar_t> convert; // codecvt_utf8 or codecvt<char16_t,char,mbstate_t> should work (will work once the char16_t specialization of codecvt works)
    vector<string> args;
    for(int i=0;i<argc;++i) {
        args.push_back(convert.to_bytes(szArglist[i]));
    }
#endif //ifdef WIN32
}

也许最好的方法是将命令行参数的处理转发到一个对象中,或者仅仅是一个函数:

#include <vector>
#include <string>
void handle_commandline_args(const std::vector<std::string>& args){
    ...
}
int main(int argc, char* argv[]){
    handle_commandline_args(std::vector<string>(argv[0], argv[0] + argc));
    ...
}

您不能从任何函数中任意获取命令行参数。在c++中,传递命令行参数的唯一方式是通过main函数中的char*数组。

如果你想在任何地方都可以访问它们,考虑将它们保存在全局变量中,或者将它们传递给每个必要的函数调用。例如:

int argumentCount;
char **argumentArray;
int main ( int argc, char** argv )
{
    argumentCount = argc;
    argumentArray = argv;
}
int foo()
{
    std::cout << argumentArray[0]; // or whatever
}

如果您正在使用msvc++,那么您可以使用下面的win32 API在程序中随时获取命令行参数:

  • GetCommandLine

但是,这会使您的代码是非标准的。因此,如果您使用main(int argc, char *argv[])来获取命令行参数并保存它们以供以后使用,例如由其他函数使用,则更好。