我正试图让“CMtoaPlugin :: listArnoldNodes()”返回一个字符串“数组”
std::vector<std::string> ArnoldNodes = CMtoaPlugin::listArnoldNodes();
std::vector<std::string>::iterator it;
for ( it=ArnoldNodes.begin() ; it < ArnoldNodes.end(); it++ )
{
printf("initialize shader %s\n", *it);
}
但这是我得到的,2个条目,这是正确的,但条目的内容不是
初始化Arnold着色器†¡/
初始化Arnold着色器。
我做错了什么
答案 0 :(得分:7)
您无法使用printf(或任何varargs方法)打印std :: string。 g ++在这里发出警告:
warning: cannot pass objects of non-POD type ‘struct std::string’ through ‘...’; call will abort at runtime
只需使用cout:
std::cout << "initialize shader " << *it << std::endl;
答案 1 :(得分:6)
另一种可能性是使用std::string
打印与printf
对应的C字符串,如下所示:
printf("initialize shader %s\n", it->c_str());
答案 2 :(得分:4)
试试这样:
for (it = ArnoldNodes.begin() ; it != ArnoldNodes.end(); ++it)
{
std::cout << "initialize shader " << *it << std::endl;
}
printf
不适用于std::string
,您需要使用cout
(或传递it->c_str()
)it != vec.end()
(因为你只需要检查相等性,而不是比较),并且++it
要增加(后增量可能效率较低)一些迭代器)。答案 3 :(得分:0)
当你在迭代器范围内循环时,你应该使用:
来执行它for ( it = ArnoldNodes.begin() ; it != ArnoldNodes.end(); it++ )
{ /*...*/ }
不同之处在于比较是!=
而不是<
,因为container.end()
迭代器返回容器的一个结尾。它不一定更“正确”,但它更具惯用性。