2010-12-14 41 views
3

Considérons une situation: J'ai un tampon de longueur connue qui stocke vraisemblablement une chaîne terminée par zéro et j'ai besoin de connaître la longueur de la chaîne.Existe-t-il une fonction C standard pour calculer la longueur de la chaîne jusqu'à une certaine limite?

Le problème est que si j'utilise strlen()et la chaîne se révèle être pas nul fin à son programme se heurte à un comportement non défini lors de la lecture au-delà de la fin de la mémoire tampon. Je voudrais donc avoir une fonction comme ce qui suit:

size_t strlenUpTo(char* buffer, size_t limit) 
{ 
    size_t count = 0; 
    while(count < limit && *buffer != 0) { 
     count++; 
     buffer++; 
    } 
    return count; 
} 

afin qu'il retourne la longueur de la chaîne, mais ne cherche jamais à lire au-delà de la fin de la mémoire tampon.

Y at-il déjà une telle fonction dans la bibliothèque C ou dois-je utiliser la mienne?

Répondre

10

Utilisez memchr(string, 0, limit), comme dans:

size_t strlenUpTo(char *s, size_t n) 
{ 
    char *z = memchr(s, 0, n); 
    return z ? z-s : n; 
} 
10

Selon ma documentation, a Posix size_t strnlen(const char *src, size_t maxlen);

n = strnlen("foobar", 7); // n = 6; 
n = strnlen("foobar", 6); // n = 6; 
n = strnlen("foobar", 5); // n = 5; 
+0

Notez que si votre système n'a pas 'strnlen', vous pouvez utiliser ma réponse comme remplacement. Nommer le remplacement 'strnlen' et s'assurer qu'il a une sémantique identique à la fonction' strnlen' POSIX est probablement plus agréable que de faire une version différemment nommée et possiblement différente. –

3

vous pouvez utiliser strnlen. C'est sa page de manuel:

NAME 
     strnlen - determine the length of a fixed-size string 

SYNOPSIS 
     #include <string.h> 

     size_t strnlen(const char *s, size_t maxlen); 

DESCRIPTION 
     The strnlen function returns the number of characters in 
     the string pointed to by s, not including the terminating 
     '\0' character, but at most maxlen. In doing this, strnlen 
     looks only at the first maxlen characters at s and never 
     beyond s+maxlen. 

RETURN VALUE 
     The strnlen function returns strlen(s), if that is less 
     than maxlen, or maxlen if there is no '\0' character among 
     the first maxlen characters pointed to by s. 

CONFORMING TO 
     This function is a GNU extension. 

SEE ALSO 
     strlen(3) 
+1

Notez la section CONFORMATION TO. C'est obsolète cependant; POSIX 2008 a standardisé cette fonction. Mais bien sûr, ce n'est toujours pas évident C. –