C ++使用参数ARGV

时间:2014-05-14 01:49:10

标签: c++ string

我想采用argv [(本例中为2)],将其存储到vector中,稍后在程序中使用它。问题是没有操作数匹配那些操作数std :: string == int。这是否意味着该应用程序会看到' -r'作为int?我在这里有点困惑。

int main(int argc, char* argv[])
{
    std::vector<std::string> argList;
    cout<<"argc: "<<argc<<endl;
    for(int i=2; i<=argc; i++)
    {
        argList.push_back(argv[i]);
    }
    if(argList.at(2) == '-r') cout<<" Good job ";
}

2 个答案:

答案 0 :(得分:1)

您的计划存在以下几个问题:

  1. 您迭代i直到i == argc,它将尝试从argv[argc]构造一个字符串,由于C {+ C ++标准要求argv[argc]成为NULL指针0(NULL),请参阅this SO question。 argv是一个argc指向null-terminated character strings的数组(以ASCII NUL,0结尾),数组本身以NULL指针终止(不计入argc)。现在,在C ++中,您可以从指向以null结尾的字符串的指针构造一个字符串,但是将NULL指针传递给字符串构造函数会导致未定义的行为see this SO question,还会看到std :: string构造函数的列表here,你隐式在该列表中使用构造函数(4)(来自c-string)。
  2. 您开始使用i==2推送到argList,这意味着argList [0]将包含argv[2],然后您引用argList.at(2),这将对应argv[4],这是不太可能是你的意思。
  3. 字符串文字使用双引号
  4. 我已经更正了这些并创建了一个工作程序,点击here

    #include <iostream>
    #include <vector>
    #include <string>
    using std::vector;
    using std::string;
    using std::cout;
    using std::endl;
    
    int main(int argc, char* argv[])
    {
        vector<string> argList;
        cout << "argc: " << argc << endl;
        for(int i=0; i < argc; ++i)
        {
            argList.push_back(argv[i]);
        }
        cout << "Program name is " << argList[0] << endl;
        if(argc > 1) {
            if(argList.at(1) == "-r") {
                cout << " Good job, you supplied -r\n";
            } else {
                cout << "Unrecognized option " << argList[1]
                    << "\nUsage: " << argList[0] << " -r\n";
            }
        }
        return 0;
    }
    

答案 1 :(得分:0)

问题是您在'-r'中使用单引号。你想要双引号:

if(argList.at(2) == "-r") cout<<" Good job ";

原因是在C ++中,单引号仅用于字符。有一个“多字节字符常量”这样的东西,这就是'-r'最终的结果。这与字符串常量完全不同,这就是你想要的。