将参数从命令行传递到C ++

时间:2016-08-21 11:45:03

标签: c++ pointers command-line-arguments

在网上搜索如何将命令行参数传递给C ++代码的示例,我想出了一个废弃的帖子,其中正在解释此过程。这段代码不起作用,经过一些修改,我想出了以下(工作)代码:

#include <iostream>
#include <windows.h>
#include <fstream>
#include <string>

using namespace std;

// When passing char arrays as parameters they must be pointers
int main(int argc, char* argv[]) {
    if (argc < 2) { // Check the value of argc. If not enough parameters have been passed, inform user and exit.
        std::cout << "Usage is -i <index file name including path and drive letter>\n"; // Inform the user of how to use the program
        std::cin.get();
        exit(0);
    } else { // if we got enough parameters...
        char* indFile;
        //std::cout << argv[0];
        for (int i = 1; i < argc; i++) { /* We will iterate over argv[] to get the parameters stored inside.
                                          * Note that we're starting on 1 because we don't need to know the 
                                          * path of the program, which is stored in argv[0] */
            if (i + 1 != argc) {// Check that we haven't finished parsing already
                if (strcmp(argv[i],"/x")==0) {
                    // We know the next argument *should* be the filename:
                    char indFile=*argv[i+1];
                    std::cout << "This is the value coming from std::cout << argv[i+1]: " << argv[i+1] <<"\n";
                    std::cout << "This is the value of indFile coming from char indFile=*argv[i+1]: " <<indFile  <<"\n";
                } else {
                    std::cout << argv[i]; 
                    std::cout << " Not enough or invalid arguments, please try again.\n";
                    Sleep(2000); 
                    exit(0);
                }   
            //std::cout << argv[i] << " ";
            }
        //... some more code
        std::cin.get();
        return 0;
        }   
    }
}

使用以下命令从Windows命令行执行此代码:

MyProgram.exe /x filename

返回下一个输出:

This is the attribute of parameter /x: filename
This is the value from *argv[i+1]: f

原帖[{3}}没有编译;上面的代码。 如你所见,打印argv [2]给我文件的名称。当我尝试将文件名捕获到另一个var中时,我可以在C ++程序中使用它,我只获得第一个字符(第二个响应行)。

现在我的问题:如何从指针指向的命令行参数中读取值? 希望有人可以用C ++帮助这个新手: - )

2 个答案:

答案 0 :(得分:1)

*argv[i+1]

访问char* argv[]参数的第一个字符。

要获得整个价值,请使用类似

的内容
std::string filename(argv[i+1]);

代替。

答案 1 :(得分:0)

您无法在单个char中存储字符串。

以下是将main参数复制到更易于管理的对象的惯用语:

#include <string>
#include <vector>
using namespace std;

void foo( vector<string> const& args )
{
    // Whatever
    (void) args;
}

auto main( int n, char* raw_args[] )
    -> int
{
    vector<string> const args{ raw_args, raw_args + n };
    foo( args );
}

请注意,此代码依赖于假设main参数的编码可以表示实际的命令行参数。这种假设在Unix-land中存在,但在Windows中则不然。在Windows中,如果要在命令行参数中处理非ASCII文本,则最好使用第三方解决方案或滚动自己的解决方案,例如:使用Windows&#39; GetCommandLine API函数。