4

我在 C 应用程序中有一个 char 数组,我必须将其分成 250 个部分,以便我可以将它发送到另一个一次不接受更多的应用程序。

我该怎么做?平台:win32。

4

4 回答 4

4

从 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;
    }
}
于 2008-10-02T15:03:18.573 回答
1

我可以想到以下几点:

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);
}
于 2008-10-02T15:05:22.983 回答
1

如果您追求性能并且允许您稍微触摸字符串(即缓冲区不是 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;
}
于 2008-10-02T15:17:26.620 回答
0

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 将终止最后一个块。

于 2008-10-03T03:40:29.533 回答