【问题标题】:How to retrieve n characters from char array如何从char数组中检索n个字符
【发布时间】:2010-09-14 20:05:08
【问题描述】:

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

我该怎么做?平台:win32。

【问题讨论】:

    标签: c arrays char


    【解决方案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;
    }
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 问题中没有说明 char 数组是用作字符串还是仅用作一小块 8 位数据,但是是的,如果需要字符串功能。
      • 必须是字符串。如果它只是一块内存,那么 strncpy 将在找到空值后立即停止。二进制数据应该使用 memcpy,而不是 strncpy
      【解决方案3】:

      来自 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;
          }
      }
      

      【讨论】:

      • 只复制数组中的前“count”个字符。你将如何获得下一个 250?
      • @Bill the Lizard:每次他调用 send250() 并获取返回值时,他都可以调用(我的头顶,不知道名称)拆分数组的方法那一点。我在这里看到的唯一问题是您每次发送 250 个字符,例如即使只有 10 个有价值的字符。
      【解决方案4】:

      我可以想到以下几点:

      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 个字符,这不会正确终止最后一个块。
      猜你喜欢
      • 1970-01-01
      • 2021-09-19
      • 2020-01-10
      • 2020-10-21
      • 2021-10-10
      • 2014-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多