所以我试图将句子存储在一个数组中,然后将它们传递给一个向量,然后打印到屏幕上,如:
void opt(char **desc)
{
std::vector <std::string> desc_v(desc, desc + sizeof(desc)/sizeof(desc[0]));
for (int i=0; i<desc_v.size(); ++i){
std::cout<< desc_v[i]<<'\n';
}
}
int main(int argc, char **argv){
static char *desc[] = {
"This is an entire sentence",
"And i want to keep printing the rest of the sentences"
};
opt(desc);
return 0;
}
但它只打印:
这是一整句
有什么帮助吗? 注意:请不要使用c ++ 11。
答案 0 :(得分:1)
您需要让opt
函数知道数组中有多少个字符串。一种简单的方法是将数组大小作为模板参数,并通过引用传递数组。以下是使用std::array
的解决方案:
#include <iostream>
#include <string>
#include <array>
#include <vector>
template<size_t N>
void opt(std::array<std::string, N> &desc)
{
std::vector <std::string> desc_v( std::begin(desc), std::end(desc) );
for ( auto&& s : desc_v ) // or just desc
std::cout << s << '\n';
}
int main()
{
std::array<std::string, 2> desc = {
"This is an entire sentence",
"And i want to keep printing the rest of the sentences"
};
opt(desc);
return 0;
}
当然,desc_v
是多余的,您可以刚刚打印desc
。
或者,该功能可以是:
template<size_t N>
void opt(char const * const (&desc)[N])
使用相同的正文,并将desc
声明为:
char const *const desc[] = {
您的现有代码自C ++ 11以来是非法的(之前已弃用);非const char *
可能无法指向字符串文字。
答案 1 :(得分:1)
我有一个疯狂的时间在脑海里解决这里发生的事情。
std::vector <std::string> desc_v(desc, desc + sizeof(desc)/sizeof(desc[0]));
您正在调用vector desc_v
的构造函数,它接受两个迭代器并在它们之间存储值。它从第一个迭代器开始,在最后一个迭代器之前结束。
sizeof(desc)/sizeof(desc[0]) //Does not do what you intended
当你sizeof(desc)
时,你的大小是char**
,而不是数组。 sizeof(desc[0])
的大小为char*
,因为char**
取消引用一次的类型为char*
。我不知道这是否有保证,但至少在这种情况下char**
和char*
大小相同,评估为1
。
std::vector <std::string> desc_v(desc, desc + 1); //It turns into this
desc
到desc + 1
的范围(包括第一个元素,但不包括最后一个元素)恰好是desc
。将其作为迭代器处理,desc_v
取消引用desc
并存储该值。该值是desc
顶层的第一个元素,它是第一个字符串文字的地址。
这就是为什么它只打印一个句子。要打印所有内容,我认为最接近你所拥有的就是使用像M.M建议的std::array
。
或者,让opt
取一个计数参数。
void opt(char **desc, int count)
{
std::vector <std::string> desc_v(desc, desc + count);
/* same */
}
//calling opt
opt(desc, 2);
或者如果你真的想......
opt(desc, sizeof(desc) / sizeof(desc[0]));