我在 C 应用程序中有一个 char 数组,我必须将其分成 250 个部分,以便我可以将它发送到另一个一次不接受更多的应用程序。
我该怎么做?平台:win32。
从 MSDN 文档:
strncpy 函数将 strSource 的初始计数字符复制到 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);
}
如果您追求性能并且允许您稍微触摸字符串(即缓冲区不是 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 个字符,包括终止的空值。如果剩余的字符少于 249 个,strncpy 将终止最后一个块。