2010-12-14 3 views
3

状況を考えてみましょう:私はおそらくヌルで終了する文字列を格納する既知の長さのバッファを持っており、文字列の長さを知る必要があります。文字列の長さをある程度まで計算するための標準的なC関数はありますか?

問題は、私はstrlen()を使用している場合、文字列はnullで終了していないことが判明しているバッファ終端を超えて読みながらプログラムは、未定義の動作に実行されます。だから私は、次のような機能を持っているしたいと思います:

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

それは文字列の長さを返しませんが、決してバッファ終端を超えて読み取ろうとするように。

このような機能は既にCライブラリにありますか、自分で使用する必要はありますか?

答えて

10

のように使用memchr(string, 0, limit)、:

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

私の文書によると、POSIXは、あなたがstrnlenを使用することができます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

システムに 'strnlen'がない場合、私の回答をドロップインの置き換えとして使うことができます。置き換えられた 'strnlen'の命名とそれがPOSIXの' strnlen'関数と同じセマンティクスを持つことを保証することはおそらく、異なる名前の、おそらく異なって動作するバージョンを作るよりも良いでしょう。 –

3

を持っています。これはそれですマンページです:

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

「準拠するセクション」に注意してください。しかし、それは時代遅れです。 POSIX 2008はこの機能を標準化しました。しかしもちろんそれはまだC言語ではありません。 –