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

我该怎么做?平台:win32。

有帮助吗?

解决方案

来自MSDN文档:

  

strncpy函数将strSource的初始计数字符复制到strDest并返回strDest。如果count小于或等于strSource的长度,则空字符不会自动附加到复制的字符串。如果count大于strSource的长度,则使用空字符填充目标字符串,直到长度计数。如果源和目标字符串重叠,则strncpy的行为未定义。

请注意, strncpy 不会检查有效的目标空间;留给程序员。原型:

char * strncpy(    char * strDest,    const char * strSource,    size_t计数 );

扩展示例:

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);
}

如果您努力提高性能并且允许稍微触摸字符串(即缓冲区不是常量,没有线程安全问题等),您可能会以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终止最后一个块。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top