以不同方式获取命令行输入

时间:2011-11-18 18:12:58

标签: c++

如何通过不使用以下结构来获取命令行参数?

 int main ( int argc, char* argv ) {

 }

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

 ./executableProgramName   inputX inputY inputZ inputT

在任何功能中?

in foo () {

 // what should I write so that I can get same effect 
}
  • 还有其他方法可以进行命令行输入吗?

4 个答案:

答案 0 :(得分:2)

获取命令行参数的标准指定的方法是传递给入口点函数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 failed\n";
    }
    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

}

答案 1 :(得分:1)

您不能随意从任何函数获取命令行参数。在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
}

答案 2 :(得分:1)

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

#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));
    ...
}

答案 3 :(得分:1)

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

然而,这会使您的代码不标准。因此,最好使用main(int argc, char *argv[])获取命令行参数并保存以供以后使用,例如供其他函数使用。