Pregunta

Tengo una matriz de caracteres en una aplicación C que tengo que dividir en partes de 250 para poder enviarla a otra aplicación que no acepte más de una vez.

¿Cómo haría eso? Plataforma: win32.

¿Fue útil?

Solución

De la documentación de MSDN:

  

La función strncpy copia los caracteres de recuento inicial de strSource en strDest y devuelve strDest. Si el recuento es menor o igual a la longitud de strSource, no se agrega automáticamente un carácter nulo a la cadena copiada. Si el recuento es mayor que la longitud de strSource, la cadena de destino se rellena con caracteres nulos hasta el recuento de longitud. El comportamiento de strncpy no está definido si las cadenas de origen y destino se superponen.

Tenga en cuenta que strncpy no comprueba el espacio de destino válido; Eso se deja al programador. Prototipo:

char * strncpy (    char * strDest,    const char * strSource,    tamaño_t cuenta );

Ejemplo extendido:

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

Otros consejos

Puedo pensar en algo como lo siguiente:

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

Si se esfuerza por lograr un rendimiento y se le permite tocar un poco la cadena (es decir, el búfer no es constante, no hay problemas de seguridad de subprocesos, etc.), podría terminar momentáneamente la cadena a intervalos de 250 caracteres y enviar en trozos, directamente desde la cadena original:

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;
}
La respuesta de

jvasaks es básicamente correcta, excepto que no ha terminado en nulo el 'bloque'. El código debe ser este:

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

}

Entonces, ahora el bloque es de 250 caracteres, incluido el nulo de terminación. strncpy terminará en nulo el último bloque si quedan menos de 249 caracteres.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top