我想采用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 ";
}
答案 0 :(得分: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)。i==2
推送到argList,这意味着argList [0]将包含argv[2]
,然后您引用argList.at(2)
,这将对应argv[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'
最终的结果。这与字符串常量完全不同,这就是你想要的。