Существует ли стандартная функция C для вычисления длины строки до некоторого предела? - PullRequest
3 голосов
/ 14 декабря 2010

Рассмотрим ситуацию: у меня есть буфер известной длины, который предположительно хранит строку с нулевым символом в конце, и мне нужно знать длину строки.* и строка оказывается не завершена нулем программа сталкивается с неопределенным поведением при чтении за пределами конца буфера.Поэтому я хотел бы иметь функцию, подобную следующей:

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

, чтобы она возвращала длину строки, но никогда не пыталась прочитать за пределами конца буфера.функция уже в библиотеке C или я должен использовать свою собственную?

Ответы [ 3 ]

10 голосов
/ 14 декабря 2010

Согласно моей документации, 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;
10 голосов
/ 14 декабря 2010

Используйте memchr(string, 0, limit), как в:

size_t strlenUpTo(char *s, size_t n)
{
    char *z = memchr(s, 0, n);
    return z ? z-s : n;
}
3 голосов
/ 14 декабря 2010

вы можете использовать strnlen. Это его справочная страница:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...