【发布时间】:2009-02-15 12:19:24
【问题描述】:
-edit- 我发送的是二进制而不是字符串。我的测试使用的是 html 页面,所以在这个例子中我只使用了一个字符串,但我的问题是关于二进制、向量和使用 ostream 进行调试。我这样做可以消除一些混乱。
我有以下代码:
cout << string(&v[0]).substr(0, len);
有没有更好的方法来打印字符串 v 并增加 cout 的长度 len?我想过做 v[len] = 0 但我抛出一个大小为 1 的断言。我的代码是:
vector<char> v;
v.reserve(1024*16); //required
v.resize(1); //so we can do &v[0]
recv(sockfd, &v[0], v.capacity(), 0);
while (l > 0)
{
cout << string(&v[0]).substr(0, l);
recv(sockfd, &v[0], v.capacity(), 0);
}
cout << "the size is " << v.size();
【问题讨论】:
-
此代码已损坏。太可怕了。使用向量来分配数组(这实际上是那里发生的事情)不仅危险(向量意味着重新分配其内部数组!)而且毫无意义。
-
如果您必须使用矢量,至少使用 v.resize(1024*16),但正如 dionadar 所述,这样做不是一个好主意,基本上无论如何都不能保护您免受任何伤害,并且可能会导致调试此代码的一些有趣的夜晚。
-
他使用矢量有什么问题?如果尺寸是动态的,我看不出有什么不好
-
(虽然在这种情况下,它不是动态的......但它可能在他的代码中,我们不知道)
-
他使用了一个vector
,它在内部创建了一个char[]来保存你放在那里的任何东西。但是调整数组的大小是不可能的,所以如果您决定调整向量的大小(有意或无意),它会创建一个新字符。然而,他现在在第一个数组的开头有一个无效的 char*。不好。