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

C++ C++;:如何读取**argv值并复制到字符串中,c++,string,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;

我正在为我的实验室制作一个新的应用程序,我必须采用一些参数,我想将
**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;
}
int main(int argc,char**argv)
{
字符串args[argc-1];
int j=0;

对于(inti=2;i来说,代码中有一些错误,这也导致了一些奇怪的问题。此外,您将事情复杂化了很多

下面是我要做的,这需要为STL容器添加一个额外的头,
,但这会使事情变得更简单(因为您不应该依赖于能够创建具有动态长度的数组(还请注意,如果没有参数,您的数组长度可能是0!))

int main(int argc,char**argv){
std::vector>params;//这是将接受所有参数的容器。
//迭代提供的所有参数
//(跳过第一个,因为这是可执行文件本身)
对于(int i=1;i
尽可能把事情弄清楚。(这将有助于在实验室进行凌晨3点的调试)

int main(int argc,char**argv)
{
标准::向量args(argc);
对于(int i=0;i

是的,我知道我浪费了
args[0]
,但是你真的在乎吗?如果你这样做的话,索引就更清晰了,
args
argv
有着相同的索引惯例(我们所有的老猫都习惯了),并且当您只传递程序名时,不会得到很多边缘情况。

我将提出以下解决方案:

std::vector<std::string> args;
std::copy(argv + 1, argv + argc, std::back_inserter(args));
std::vector args;
std::copy(argv+1,argv+argc,std::back_inserter(args));
参考资料:


稍微解释一下,这将从
argv[1]
(我不关心
argv[0]
,因为它是“命令”,通常与参数处理无关)复制到向量中。我们停止在
argv[argc]
复制,这超出了实际参数的末尾(这就是“end”迭代器的工作方式)

std::back\u inserter
创建一个特殊的迭代器,用于在容器的末尾插入ad。

int main(int argc,char**argv)
 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;
}
{ 字符串args[argc]; int j=0;
首先,对于(inti=2;i,不能在静态表达式中使用动态参数。 您必须使用new来创建字符串数组,或者更好地使用vector(或者您喜欢的任何其他容器)。 其次,一个字符一个字符地复制值是没有意义的。复制整个字符串

下面是一个示例代码:

#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;
}
#包括
#包括
#包括
使用名称空间std;
typedef向量svec;
int main(int argc,字符**argv)
{
svec字符串;
如果(argc>1)
{

cout使用范围构造函数的最快和最短解决方案:

std::vector<std::string> args(argv + 1,argv + argc);
std::向量args(argv+1,argv+argc);

由于
argv
中的每个条目都是一个字符串,因此循环执行
args[i]=argv[i+1]
如果我没有向程序传递任何参数,即
argc
为1?:)则在新编辑时,您将跳过给定的第一个参数(
argv[1]
),再加上数组仍然有一个条目太长。(不想唠叨,只是指出问题。)我想这很可能是最简洁的解决方案,尽管对新手来说有点难理解-你可能想概述正在发生的事情,而不仅仅是链接到文档。+1,用于炫耀和首次提交正确的答案。(请参阅编辑我答案上的历史记录)为什么不直接使用向量的
begin,end
构造函数?(4)首先,你不能在静态表达式中使用动态参数。有些编译器允许使用动态参数,但你不能依赖它,你可能会遇到问题(即结果长度为0)。实际上不是范围“insert”;它只是一个构造函数。
#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;
}
std::vector<std::string> args(argv + 1,argv + argc);