2008-10-02 4 views

Répondre

4

De la documentation MSDN:

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

Notez que strncpy ne vérifie pas l'espace de destination valide; c'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; 
    } 
} 
+0

duh! Comment ça m'a manqué? Merci! – SinisterDex

+0

Cela copie uniquement les premiers caractères 'count' du tableau. Comment allez-vous obtenir les 250 prochains? –

+0

@Bill le Lézard: Chaque fois qu'il appelle send250() et obtient la valeur de retour, il pourrait appeler (hors de ma tête, je ne connais pas le nom) la méthode pour diviser le tableau à ce point. Le seul problème que je vois ici est que vous envoyez 250 caractères à chaque fois, par exemple même s'il n'y en a que 10 de valeur. – junkforce

1

Je peux penser à quelque chose le long des lignes de 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); 
} 
+0

Ceci ne termine pas le dernier morceau correctement s'il est inférieur à 250 caractères. – Roddy

1

Si vous vous efforcez de performance et que vous êtes autorisé pour toucher un peu la chaîne (c'est-à-dire que le tampon n'est pas const, pas de problèmes de sécurité, etc.), vous pouvez momentanément mettre fin à la chaîne à des intervalles de 250 caractères et l'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; 
} 
0

La réponse de jvasaks est fondamentalement correcte, sauf qu'il n'a pas nul terminé « 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 de 250 caractères, y compris le caractère nul. strncpy annulera le dernier bloc s'il reste moins de 249 caractères.

+0

Il n'est pas indiqué dans la question si le tableau char est utilisé comme une chaîne ou simplement un petit bloc de données 8 bits, mais oui, vous devez mettre fin à null comme vous l'avez montré ci-dessus si la fonctionnalité chaîne est souhaitée. – jvasak

+0

Ce doit être une chaîne. Si c'est juste un bloc de mémoire, alors strncpy s'arrêtera dès qu'il trouvera une valeur nulle. Les données binaires doivent utiliser memcpy, pas strncpy –

Questions connexes