【发布时间】:2010-09-14 20:05:08
【问题描述】:
我在 C 应用程序中有一个 char 数组,我必须将其拆分为 250 个部分,以便我可以将它发送到另一个一次不接受更多的应用程序。
我该怎么做?平台:win32。
【问题讨论】:
我在 C 应用程序中有一个 char 数组,我必须将其拆分为 250 个部分,以便我可以将它发送到另一个一次不接受更多的应用程序。
我该怎么做?平台:win32。
【问题讨论】:
如果您追求性能并且允许稍微接触字符串(即缓冲区不是 const,没有线程安全问题等),您可以以 250 个字符的间隔暂时对字符串进行空终止并发送它分块,直接来自原始字符串:
char *str_end = str + strlen(str);
char *chunk_start = str;
while (true) {
char *chunk_end = chunk_start + 250;
if (chunk_end >= str_end) {
transmit(chunk_start);
break;
}
char hijacked = *chunk_end;
*chunk_end = '\0';
transmit(chunk_start);
*chunk_end = hijacked;
chunk_start = chunk_end;
}
【讨论】:
jvasaks 的回答基本上是正确的,只是他没有以空值终止的“块”。代码应该是这样的:
void send250(char *inMsg, int msgLen)
{
char block[250];
while (msgLen > 0)
{
int len = (msgLen>249) ? 249 : msgLen;
strncpy(block, inMsg, 249);
block[249] = 0;
// send block to other entity
msgLen -= len;
inMsg += len;
}
}
所以,现在这个块是 250 个字符,包括终止的 null。如果剩余的字符少于 249 个,strncpy 将 null 终止最后一个块。
【讨论】:
来自 MSDN 文档:
strncpy 函数将 strSource 的初始 count 个字符复制到 strDest 并返回 strDest。如果 count 小于或等于 strSource 的长度,则不会自动将空字符附加到复制的字符串。如果 count 大于 strSource 的长度,则用空字符填充目标字符串,直到长度为 count。如果源字符串和目标字符串重叠,则 strncpy 的行为未定义。
注意strncpy 不检查有效的目标空间;这是留给程序员的。原型:
char *strncpy(
char *strDest,
const char *strSource,
size_t count
);
扩展示例:
void send250(char *inMsg, int msgLen)
{
char block[250];
while (msgLen > 0)
{
int len = (msgLen>250) ? 250 : msgLen;
strncpy(block, inMsg, 250);
// send block to other entity
msgLen -= len;
inMsg += len;
}
}
【讨论】:
我可以想到以下几点:
char *somehugearray;
char chunk[251] ={0};
int k;
int l;
for(l=0;;){
for(k=0; k<250 && somehugearray[l]!=0; k++){
chunk[k] = somehugearray[l];
l++;
}
chunk[k] = '\0';
dohandoff(chunk);
}
【讨论】: