Как определить массив символов в C ++ - PullRequest
0 голосов
/ 12 марта 2012

У меня есть этот код, и он правильно компилируется:

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 ]

3 голосов
/ 12 марта 2012

Преобразование строковых литералов в char* больше не разрешено, поскольку это никогда не было безопасно. Вместо этого создайте массив из const char*. (Хотя я не уверен на 100%, что это является причиной вашей ошибки, но ваш код не соответствует вашей ошибке, я думаю, что вы изменили что-то, чтобы поместить его в SO). std::string имеет конструктор из const 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::vector из std::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);
0 голосов
/ 12 марта 2012

Одним из решений является использование 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 строковыми литералами.

0 голосов
/ 12 марта 2012

Я бы просто использовал 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); должен работать.

...