C ++:如何读取** argv值并复制到字符串中

时间:2014-02-21 10:04:22

标签: c++ string

我正在为我的实验室制作一个新的应用程序,我必须在表单终端中使用一些参数,并且我想将**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;
}

6 个答案:

答案 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