0

我有一个记分板,可以随时更新新信息,缓冲区大小=我的记分板可以处理的行数,但我正试图让它无限无限。

我正在尝试做的是将无穷大值分配给这样的缓冲区:

 const int infinity = std::numeric_limits<const int>::infinity(); 

 char Buffer_format_text [infinity]; 

但它不起作用,因为它说:

错误 C2057:预期的常量表达式错误 C2466:无法分配常量大小为 0 的数组

有没有办法做到这一点?还是把戏?, 请帮我。不要问我为什么要这样做,我要问的是怎么做。

更新:

这就是我用 sprintf 做的,你在 ostringstream 中是怎么做的?

char Buff[100]; 
int length  = 0;
int amount_of_space = 8;
length += sprintf(Buff+length,"%-*s %s\n", amount_of_space, "Test", "Hello");

 

this output: Test     Hello
4

4 回答 4

6

在 C++11 中,infinity()is constexpr,所以理论上你可以这样直接使用它:

char Buffer_format_text[std::numeric_limits<const int>::infinity()];

但是,这里的问题是int 不能表示无穷大。如果你试过这个:

std::cout << std::numeric_limits<const int>::has_infinity;

您会看到0( false) 被打印到标准输出(现场示例)。where is的infinity()特化函数将返回 0 - 事实上,该函数在这些情况下毫无意义 - 并且您不能创建大小为 0 的数组。std::numeric_limitshas_infinityfalse

此外,您不能期望分配一个无限大小的数组 - 它如何适合内存?如果您事先不知道向量的大小,正确的方法是使用std::vector或类似的容器,它会根据请求分配内存。


更新:

看来您实际上需要一个无限数组是为了能够构建一个事先不知道大小的字符串。要封装这样一个动态增长的字符串,您可以使用std::string.

为了执行类型安全的输出到 anstd::string和 replacesprintf()中,您可以使用std::ostringstream. 这将允许您将内容插入字符串,就像将其打印到标准输出一样。

然后,一旦你完成了对 的处理std::ostringstream,你可以std::string通过调用str()成员函数从中获取一个对象。

这是您可以在一个简单示例中使用它的方式:

#include <string>
#include <sstream>
#include <iostream>
#include <iomanip>

int main()
{
    std::ostringstream oss;

    oss << "The answer is: ";
    oss << 42;
    oss << ", and this is a double: ";
    oss << 3.14;
    oss << ". " << std::endl;
    oss << "Oh, btw, you can also output booleans: ";
    oss << std::boolalpha << true;
    oss << ". See? It's easy!" << std::endl;

    std::cout << oss.str();
}

现场演示

于 2013-04-20T14:24:52.283 回答
2

您基本上不能在堆栈或堆上分配具有真正无限内存的数组。您也不能分配大小为 0 的数组,因为根据标准它是非法的。

您可以尝试使用在必要时自行增长的 std::vector。但是您仍然无法infinite分配内存,因为无论它有多大,您的磁盘空间都是有限的。

于 2013-04-20T14:18:50.697 回答
2

将缓冲区声明为无穷大是没有意义的,因为整数类型(通常)不能表示无穷大(FP 类型的infinity成员numeric_limits存在),并且因为没有机器可以创建无穷大字节的缓冲区。:)

相反,使用一个容器,它可以自己处理新插入所需的重新分配,仅受可用内存限制,例如std::vectorstd::deque或其他,取决于您的插入/删除模式)。


编辑:由于问题似乎是关于创建一个任意长的字符串,因此“C++ 答案”是使用std::ostringstream,它允许您编写任意数量的元素(仅受可用内存限制)并为您提供std::string结果.

std::ostringstream os;
for(int i=0; i<1000; i++)
    os<<rand()<<" ";
std::string out=os.str();
// now in out you have a concatenation of 1000 random numbers

编辑/2:

这就是我用 sprintf 做的,你在 ostringstream 中是怎么做的?

char Buff[100]; 
int length  = 0;
int amount_of_space = 8;
length += sprintf(Buff+length,"%-*s %s\n", amount_of_space, "Test", "Hello");
// needed headers: <sstream> and <iomanip>
std::ostringstream os;
int amount_of_space = 8;
os<<std::left<<std::setw(amount_of_space)<<"Test"<<" "<<"Hello";
std::string out=os.str(); // you can get `length` with `out.size()`.

但是,如果您只需要在最后进行多次插入调用os.str(),那么当您实际需要该字符串时。同样,无需跟踪长度,流会自动完成。

于 2013-04-20T14:20:27.590 回答
0

您应该使用可以动态增长的容器,例如std::vector(或者,您的情况似乎是文本,std::string)。

你可以std::ostringstream用来构造一个std::string这样的:

#include <iomanip>
#include <sstream>

std::ostringstream ss;
ss << std::setw(amount_of_space) << std::left << "Test" << ' ' << "Hello" << '\n';
std::string result = ss.str();
于 2013-04-20T14:20:49.660 回答