Pergunta

Eu tenho uma matriz de char em um aplicativo C que eu tenho que dividir em partes de 250 para que eu possa enviá-lo juntamente com outro aplicativo que não aceita mais de uma vez.

Como eu faria isso? Plataforma: win32.

Foi útil?

Solução

A partir da documentação MSDN:

A função strncpy copia os caracteres contagem inicial de strSource para strDest e retorna strDest. Se a contagem for menor ou igual ao comprimento de strSource, um caractere nulo não é acrescentado automaticamente para a cadeia copiado. Se a contagem for maior do que o comprimento de strSource, a string de destino é preenchido com caracteres nulos até contagem de comprimento. O comportamento do strncpy é indefinido se as cordas origem e de destino se sobrepõem.

Note que strncpy não verifica espaço de destino válido; que é deixado para o programador. Protótipo:

char *strncpy( char *strDest, const char *strSource, size_t count );

exemplo estendida:

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

Outras dicas

Não consigo pensar em algo ao longo das linhas do seguinte:

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

Se você se esforça para desempenho e você tem permissão para tocar a corda um pouco (ou seja, o buffer não é const, há questões de segurança fio etc.), você poderia momentaneamente nulo encerrar a seqüência em intervalos de 250 caracteres e enviar -lo em pedaços, diretamente a partir do string 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;
}

resposta das jvasaks é basicamente correto, exceto que ele não tem um terminador nulo 'block'. O código deve 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;
    }

}

Então, agora o bloco é de 250 caracteres, incluindo o nulo de terminação. strncpy será nulo encerrar o último bloco se houver menos de 249 caracteres restantes.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top