【发布时间】:2011-10-16 01:18:58
【问题描述】:
我正在寻找的东西在哪里:
string pearString ("pear");
string bananaString ("banana");
cout << ???? 5 ??? pearString ??????? << "[end]" << endl;
cout << ???? 5 ??? bananaString ??????? << "[end]" << endl;
将(对于某些代码字符序列???)输出:
pear[end]
banan[end]
但我希望它能够工作,而不必执行复制字符串的子字符串操作。除非我遗漏了什么,否则没有格式说明符。 (setw 说明符填充较短的字符串,但允许较长的字符串溢出。)
我想到的一个“棘手”的事情是使用自己的流输出运算符制作一个轻量级包装类。它将采用(非常量)字符串引用和其结构的限制。然后输出运算符将测试长度,如果它小于或等于限制,则执行标准输出。如果它更大,它会暂时在长度位置插入一个空字符,长度刚好足以进行输出......然后将原始字符放回去。
(更新:实际上这个想法是行不通的,因为<< 忽略了嵌入的空值。)
无论如何,它的外观的想法是:
cout << strlimiter(5, pearString) << "[end]" << endl;
cout << strlimiter(5, bananaString) << "[end]" << endl;
有什么更简洁的解决方案可以在 const 字符串上工作并且不会从你下面弄出数据?使用其他扩展 iostream 的钩子或技巧的东西?这是否被某处的图书馆所覆盖?
更新:我忽略了 iostream 的 write 方法代替 <<,所以这里有一些示例代码:
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
class strlimiter
{
friend ostream& operator<< (ostream& os, strlimiter sl);
private:
const string& data;
size_t limit;
public:
strlimiter(const string& data, size_t limit) : data(data), limit(limit) {}
~strlimiter() {}
};
ostream& operator<< (ostream& os, strlimiter sl) {
return os.write(sl.data.c_str(), min(sl.data.length(), sl.limit));
}
int main() {
string pearString ("pear");
string bananaString ("banana");
cout << strlimiter(pearString, 5) << "[end]" << endl;
cout << strlimiter(bananaString, 5) << "[end]" << endl;
return 0;
}
还有什么技巧可以让其在运行时的成本更少?
【问题讨论】:
标签: c++ string-formatting iostream