问题要求创建一个程序,该程序要求用户输入一些文本,并且文本将根据屏幕的宽度被星号包围,例如,如果用户输入“ Hello world”,则输出应为:>
****************
* Hello World! *
****************
我试图创建函数,但是由于显示的最少代码导致编译器错误,我被卡住了。
问题:为什么它告诉我no matching function
的{{1}}?
下面有一些代码:
within_width(text, 80)
答案 0 :(得分:2)
此函数的声明
bool within_width (std::string& text, unsigned short int& max_width)
询问无符号的短整数变量,因为它具有参考参数,请参见第二个&。
要满足此要求,您需要将值80放入变量并将变量作为参数。
unsigned short int MyWidth=80;
if (within_width(text, MyWidth))
或者(但我假设您是不允许的),您可以使用按值参数调用
bool within_width (std::string& text, unsigned short int max_width)
然后您可以如图所示致电。
答案 1 :(得分:0)
在这里,我不会给出完整的答案,只是一些线索。
display_header()
和within_width()
函数需要知道参数中给出的字符串,但不能对其进行修改;因此此参数的类型应为const std::string &
(缺少const
)。within_width()
函数的第二个参数只是一个整数,将与字符串的长度进行比较;您不需要通过引用(或至少为const
),而是通过值来传递它。此处,(非{const
)引用可防止传递文字常量80
。Hello World!
为12);此信息可通过size(text)
(或text.size()
)获得max_width
header
显示行将需要另外4个字符,因为*
会被前置,*
会被附加。size(header)+4
。*
组成的字符串,可以使用std::string
的构造函数,该构造函数具有两个参数:字符数和要重复的字符。std::cout
。答案 2 :(得分:0)
编辑: 只是注意到此答案可能远远超出了您已完成的任务的范围(仅填写已提供的某些框架)由您的老师)。
我仍将其留在此处以说明使用任意输入可以完成的。也许您想比您要求的做更多的尝试...
bool within_width(...)
非常简单:string.length() <= max
–请稍等片刻,您需要在输出的开头和结尾考虑星号和空格,因此:max - 4
但是您可以做得更好,可以对字符串进行分割,最好是在单词边界处。不过,这有点困难,但更困难:
std::vector<std::string> lines;
// we'll be starting with an initially empty line:
auto lineBegin = text.begin();
auto lineEnd = text.begin();
for(auto i = text.begin(); i != text.end(); ++)
// stop condition empty: we'll stop from inside the loop...
{
// ok, we need to find next whitespace...
// we might try using text.find_first_of("..."), but then we
// need to know any whitespace characters ourselves, so I personally
// would rather iterate manually and use isspace function to determine;
// advantage: we can do other checks at the same time, too
auto distance = std::distance(lineBegin, i);
if(std::distance(lineBegin, i) > maxLineLength)
{
if(lineEnd == lineBegin)
{
// OK, now we have a problem: the word itself is too long
// decide yourself, do you want to cut the word somewhere in the
// middle (you even might implement syllable division...)
// or just refuse to print (i. e. throw an exception you catch
// elsewhere) - decide yourself...
}
else
{
lines.emplace_back(lineBegin, lineEnd);
lineBegin = lineEnd; // start next line...
}
}
// OK, now handle current character appropriately
// note: no else: we need to handle the character in ANY case,
// if we terminated the previous line or not
if(std::isspace(static_cast<unsigned char>(*i)))
{
lineEnd = i;
}
// otherwise, we're inside a word and just go on
}
// last line hasn't been added!
lines.emplace_back(lineBegin, lineEnd);
现在,您可以计算包含的所有字符串的最大长度。最好:在向向量添加新行时这样做是正确的,那么您就不需要单独的循环...
您可能已经注意到,我没有删除字符串末尾的空格,因此,除了最后一个字符串之外,您不需要添加自己的空格(因此,您可以添加{{ 1}})。
到目前为止,丑陋的部分是我留下了多个后续空白。最好的做法是删除 before 分割成几行,但要注意,您至少需要保留一个。所以:
lines.back() += ' ';
这会将所有单词移到字符串的开头,但是我们尚未删除字符串剩余的部分:
auto end = text.begin();
bool isInWord = false; // will remove leading whitespace, if there is
for(auto c : text)
{
if(std::isspace(static_cast<unsigned char>(c)))
{
if(isInWord)
{
*end++ = ' '; // add a single space
isInWord = false;
}
}
else
{
*end++ = c;
isInWord = true;
}
}
好的,其余的很简单:
text.erase(end, text.end());
最后:您引入了80个字符的固定行限制。如果控制台更大,您将不会使用整个可用宽度,但是这可能是可以接受的;如果控制台更小,则会在错误的位置处折断行。
您现在可以(但是这是可选的)尝试检测控制台的宽度-以前是asked,所以我将不做进一步介绍。
最后一点:上面提供的代码未经测试,因此不能保证没有错误!