如何在c ++中定义一个字符数组

时间:2012-03-12 19:15:33

标签: c++ arrays char

我有这段代码并正确编译:

char classfname[512] = "classifiers/cabmodel_VOC05motorbikes.xml";
strcpy(classfname,argv[i]);

但是当我试图定义一个数组包含来自相同大小的上述大小的字符串时 并且在你的帮助下它没有用!

std::vector<std::string> classfname = {
    "classifiers/cabmodel_VOC05motorbikes.xml",
    "classifiers/cabmodel_interm_nst100_VOC06person01train5_orienthistmod.xml" ,
    "classifiers/cabmodel_interm_nst40_VOC06cat01train5_trainval_orienthistmod_nopert_facereg.xml",
    "classifiers/cabmodel_interm_nst100_VOC06bicycle01train5_trainval_orienthistmod.xml",
    "classifiers/cabmodel_VOC06carside.xml",
    "classifiers/cabmodel_interm_nst100_VOC06horse01train5_trainval_orienthistmod_randsel0100.xml"
    };

char *classfname[6]={-----}
std::vector<std::string> classfname;
classfname.push_back(",,,");

使用函数strcpy(classfname,argv[i]);

我收到了错误:

Error   2   error C2664: 'strcpy' : cannot convert parameter 1 from 'std::string' to 'char *

3 个答案:

答案 0 :(得分:3)

不再允许将字符串文字转换为char*,因为它永远不会安全。而是创建一个const char*数组。 (虽然我不是100%肯定这是你的错误的原因,但你的代码不能很好地匹配你的错误,我认为你改变了一些东西把它放在SO上)。 std::stringconst char*的构造函数,所以这应该可以正常工作。

此外,值得注意的是(const::std string &不正确,因此我们知道您在此处发布时更改了内容。不要这样做,否则我们根本无法帮助你。它应该是(const std::string&

另外,MrC64指出你应该使用RAII而不是原始数组和指针。它更容易使用,更难搞乱。

std::vector<std::string> classfname = {
    "classifiers/cabmodel_VOC05motorbikes.xml",
    "classifiers/cabmodel_interm_nst100_VOC06person01train5_orienthistmod.xml" ,
    "classifiers/cabmodel_interm_nst40_VOC06cat01train5_trainval_orienthistmod_nopert_facereg.xml",
    "classifiers/cabmodel_interm_nst100_VOC06bicycle01train5_trainval_orienthistmod.xml",
    "classifiers/cabmodel_VOC06carside.xml",
    "classifiers/cabmodel_interm_nst100_VOC06horse01train5_trainval_orienthistmod_randsel0100.xml"
    };

如果您的编译器无法处理该语法(许多不能),请使用Mr_C64建议的代码。

[编辑] 您已将问题大幅改变为完全不同的问题。一般情况下这很糟糕,因为任何来到此页面寻找答案的人都会看到我们的答案不再符合您的问题。如果您还有其他问题,则应使用搜索功能,或者创建新的问题页面。

现在,您的代码的std::vectorstd::strings。像std::string一样对待int。只需复制它,或传递它,不用担心。您没有使用特殊功能来复制int,因此您不需要特殊功能来复制字符串。只需执行std::string newstring = classfname[0];即可获取数组0中索引为classfname的字符串副本。

您的“旧”代码会将一个字符数组初始化为字符串文字,并使用argv[i]的输入对其进行过度保护。执行该代码的最佳方法是:

std::string classfname = "classifiers/cabmodel_VOC05motorbikes.xml";
classfname = argv[i];

如果您只想创建每个参数的数组,那很容易:

int main() {int argc, const char** argv) { 
    std::vector<std::string> classfname(argv, argv+argc);

答案 1 :(得分:0)

我只使用std::vector<std::string>而不是“原始”C数组:

#include <string>
#include <vector>

std::vector<std::string> classfname;
classfname.push_back("classifiers/cabmodel_VOC05motorbikes.xml");
classfname.push_back("classifiers/cabmodel_interm_nst100_VOC06person01train5_orienthistmod.xml");
...

std::vector重载operator[],因此您的调用xmlloadmodel(classfname[i],model);应该有效。

答案 2 :(得分:0)

一种解决方案是使用const char*,如下所示:

const char *classfname[7]={"classifiers/cabmodel_VOC05motorbikes.xml",
    "classifiers/cabmodel_interm_nst100_VOC06person01train5_orienthistmod.xml" ,
    "classifiers/cabmodel_interm_nst40_VOC06cat01train5_trainval_orienthistmod_nopert_facereg.xml",
    "classifiers/cabmodel_interm_nst100_VOC06bicycle01train5_trainval_orienthistmod.xml",
    "classifiers/cabmodel_VOC06carside.xml",
    "classifiers/cabmodel_interm_nst100_VOC06horse01train5_trainval_orienthistmod_randsel0100.xml",
};

此外,如果您想要包含这些字符串的std::vector,可以使用以下语句对其进行初始化:

const std::vector<std::string> classfname_vector(classfname, classfname + 7);

我注意到的另一件事是你声明了一个包含7个元素的数组,但只用6个字符串文字初始化它。