我正在为我的实验室制作一个新的应用程序,我必须在表单终端中使用一些参数,并且我想将**args
值复制到一个字符串中,之后我必须匹配args
执行一些前戏操作。
我尝试构建此代码以将**argv
值复制到字符串var中,但这是错误:
No source available for "std::string::operator=() at 0x44c1dc"
代码是这样的:
int main(int argc, char **argv)
{
string args[argc-1];
int j=0;
for(int i=2; i<argc-1;i++)
{
j=0;
while(argv[i][j]!='\0')
{
args[i]=args[i]+argv[i][j];
j++;
}
}
return 0;
}
答案 0 :(得分:8)
我会提出这个解决方案:
std::vector<std::string> args;
std::copy(argv + 1, argv + argc, std::back_inserter(args));
参考文献:
为了解释一下,这个副本从argv[1]
(我不关心argv[0]
,因为它是“命令”,通常与参数处理无关)到向量中。我们停止在argv[argc]
处复制,这是超出实际参数结尾的一个(这是“结束”迭代器的工作方式)。
std::back_inserter
创建一个特殊的迭代器,用于在容器的末尾插入广告。
答案 1 :(得分:5)
使用范围构造函数的最快和最短的解决方案:
std::vector<std::string> args(argv + 1,argv + argc);
答案 2 :(得分:3)
尽可能清楚地说明事情。 (将帮助您实验室的那些凌晨3点的调试会议。)
int main(int argc, char **argv)
{
std::vector<std::string> args(argc);
for (int i = 0; i < argc; ++i){
args[i] = argv[i];
}
// rest of code here.
}
是的,我知道我浪费了args[0]
,但你真的在乎吗?如果你这样做,索引会更加清晰,args
具有与argv
相同的索引约定(我们所有的老猫都习惯了),你不要当你只传递程序名时,会得到很多边缘情况。
答案 3 :(得分:1)
您的代码中存在一些错误,这也会导致奇怪的问题。你也过分复杂了。
这是我要做的,这将需要一个额外的标头<vector>
,用于STL容器,但它会使事情变得更容易(因为你不应该依赖于能够创建数组动态长度(还要注意,如果没有给出参数,你的数组长度可能为0)。)
int main(int argc, char **argv) {
std::vector<const std::string>> params; // This is the container that will take all arguments.
// Iterate over all arguments provided
// (skipping the very first, since that's the executable itself)
for (int i = 1; i < argc; i++)
// Add the argument to the vector
// (this will construct a new std::string and add it to the end).
params.push_back(argv[i]);
// You're now able to access the arguments passed:
// params.size() will return the number of arguments.
// params[i] will return the i-th argument, starting at 0.
return 0;
}
答案 4 :(得分:0)
int main(int argc, char **argv)
{
string args[argc];
int j=0;
for(int i=2; i<argc;i++)
{
args[i-2].assign(argv[i]);
}
return 0;
}
答案 5 :(得分:0)
首先,您不能在静态表达式中使用动态参数。 你必须使用new来创建一个字符串数组,或者更好的是,使用一个向量(或你喜欢的任何其他容器)。 第二,将一个字符的值复制到另一个字符是没有意义的。复制整个字符串。
这是一个可行的示例代码:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
typedef vector<string> svec;
int main(int argc,char **argv)
{
svec strings;
if(argc>1)
{
cout <<"arguments:"<<endl;
for(int i=1;i<argc;i++)
{
strings.push_back(argv[i]);
}
}
for(auto i:strings)
{
cout << i;
}
return 0;
}
d