Question

J'ai une matrice de caractères dans une application C que je dois diviser en parties de 250 pour pouvoir l'envoyer à une autre application qui n'en accepte pas plus à la fois.

Comment je ferais ça? Plate-forme: win32.

Était-ce utile?

La solution

Dans la documentation MSDN:

  

La fonction strncpy copie le nombre de caractères initial de strSource dans strDest et renvoie strDest. Si count est inférieur ou égal à la longueur de strSource, un caractère null n'est pas ajouté automatiquement à la chaîne copiée. Si nombre est supérieur à la longueur de strSource, la chaîne de destination est complétée avec des caractères nuls jusqu'à la longueur. Le comportement de strncpy n'est pas défini si les chaînes source et cible se chevauchent.

Notez que strncpy ne vérifie pas l'espace de destination valide; cela est laissé au programmeur. Prototype:

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

Exemple étendu:

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

Autres conseils

Je peux penser à quelque chose comme ce qui suit:

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 vous recherchez des performances et que vous êtes autorisé à toucher un peu la chaîne (le tampon n’est pas constant, pas de problèmes de sécurité des threads, etc.), vous pouvez interrompre momentanément la chaîne à 250 caractères et envoyer en morceaux, directement à partir de la chaîne d'origine:

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 réponse de jvasaks est fondamentalement correcte, à l'exception du fait qu'il n'a pas mis fin au bloc "bloc". Le code devrait être ceci:

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

}

Donc, maintenant, le bloc est composé de 250 caractères, y compris le null final. strncpy mettra un terme nul au dernier bloc s'il reste moins de 249 caractères.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top