Como para recuperar n caracteres de matriz de char
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.
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.