Skip to contentSkip to conversation

strlen man-page misinformation

DISCUSSION Michael Kerrisk (man-pages) 3 participants 3 messages Feb 18, 2016 4 messages not in the archive Man-pages: manual pages for Linux -- Sections 2, 3, 4, 5, and 7

lore
Share & tools
lore

A message that is not in the archive (sent off-list or not yet received): [email protected]

A message that is not in the archive (sent off-list or not yet received): [email protected]

#2 lore raw

Hello Alan,

Quoted 4 lines · Alan Aversa

Hello,

The 2015-08-08 strlen man-page is incorrect. Here's a diff:

Quoted 9 lines

--- a/man3/strlen.3
+++ b/man3/strlen.3
@@ -45,7 +45,7 @@ excluding the terminating null byte (\(aq\\0\(aq).
.SH RETURN VALUE
The
.BR strlen ()
-function returns the number of bytes in the string +function returns the number of *characters* in the string that precede the terminating null character

I went for a simpler change: s/bytes/characters/

Quoted 9 lines
     .IR s .
     .SH ATTRIBUTES
     For an explanation of the terms used in this section, see
    @@ -60,7 +60,7 @@ T{
     T}     Thread safety   MT-Safe
     .TE
     .SH CONFORMING TO
    -POSIX.1-2001, POSIX.1-2008, C89, C99, SVr4, 4.3BSD.
    +POSIX.1-2001, POSIX.1-2008, C89, C99, C11, SVr4, 4.3BSD.

Fixed.

Quoted 9 lines
     .SH SEE ALSO
     .BR string (3),
     .BR strnlen (3),

Page 392 (PDF p. 390, §7.24.6.3) of the C11 standard
<http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf> says:

The *strlen* function returns the number of characters that precede the terminating null character.

Thanks for the report. Interesting, POSIX.1 still uses the term "bytes" the spec.

Cheers,

Michael

Signature · 7 lines
Michael Kerrisk
Linux man-pages maintainer; http://www.kernel.org/doc/man-pages/
Linux/UNIX System Programming Training: http://man7.org/training/
--
To unsubscribe from this list: send the line "unsubscribe linux-man" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

A message that is not in the archive (sent off-list or not yet received): [email protected]

#4 lore raw

Am 18.02.2016 14:12, schrieb Michael Kerrisk (man-pages):

Quoted 17 lines

Hello Alan,

Quoted 4 lines · Alan Aversa

Hello,

The 2015-08-08 strlen man-page is incorrect. Here's a diff:

Quoted 9 lines

--- a/man3/strlen.3
+++ b/man3/strlen.3
@@ -45,7 +45,7 @@ excluding the terminating null byte (\(aq\\0\(aq).
.SH RETURN VALUE
The
.BR strlen ()
-function returns the number of bytes in the string +function returns the number of *characters* in the string that precede the terminating null character

Quoted 1 line

I went for a simpler change: s/bytes/characters/

For my understanding this is wrong. 1 character may be represented by 2 or more bytes (utf8). see this example, the string (test) is 3 characters long and takes 6 bytes space.

did i miss something ? did the specification of character change ?

re,
wh

#include <stdio.h>
#include <string.h>

int main()

{
        char *test="ÖÄÜ";
        int i;
        int len=strlen(test);
        printf("strlen=%d\n",len);

        for(i=0;i<len;i++)
                printf("%02x\n",(unsigned char)*(test+i));

        return 0;
}

output:
strlen=6
c3
96
c3
84
c3
9c

Quoted 23 lines
Quoted 10 lines
     .IR s .
     .SH ATTRIBUTES
     For an explanation of the terms used in this section, see
    @@ -60,7 +60,7 @@ T{
     T}     Thread safety   MT-Safe
     .TE
     .SH CONFORMING TO
    -POSIX.1-2001, POSIX.1-2008, C89, C99, SVr4, 4.3BSD.
    +POSIX.1-2001, POSIX.1-2008, C89, C99, C11, SVr4, 4.3BSD.

Fixed.

Quoted 9 lines
     .SH SEE ALSO
     .BR string (3),
     .BR strnlen (3),

Page 392 (PDF p. 390, §7.24.6.3) of the C11 standard
<http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf> says:

The *strlen* function returns the number of characters that precede the terminating null character.

Quoted 8 lines

Thanks for the report. Interesting, POSIX.1 still uses the term "bytes" the spec.

Cheers,

Michael

--
To unsubscribe from this list: send the line "unsubscribe linux-man" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html

A message that is not in the archive (sent off-list or not yet received): [email protected]

#6 lore raw
Quoted 20 lines · walter harms

Am 18.02.2016 14:12, schrieb Michael Kerrisk (man-pages):

Quoted 17 lines

Hello Alan,

Quoted 13 lines · Alan Aversa

Hello,

The 2015-08-08 strlen man-page is incorrect. Here's a diff:

--- a/man3/strlen.3
+++ b/man3/strlen.3
@@ -45,7 +45,7 @@ excluding the terminating null byte (\(aq\\0\(aq).
.SH RETURN VALUE
The
.BR strlen ()
-function returns the number of bytes in the string +function returns the number of *characters* in the string that precede the terminating null character

Quoted 7 lines
Quoted 1 line

I went for a simpler change: s/bytes/characters/

For my understanding this is wrong. 1 character may be represented by 2 or more bytes (utf8). see this example, the string (test) is 3 characters long and takes 6 bytes space.

did i miss something ? did the specification of character change ?

[...]

Either "bytes" or "characters" would be correct. POSIX says "bytes"; ISO C says "characters".

See the definition of "character" in C11 3.7.1:

Quoted 1 line

bit representation that fits in a byte

On the other hand, 3.7 defines an (abstract) "character" as:

Quoted 2 lines

member of a set of elements used for the organization, control, or representation of data

It also defines the terms "multibyte character" (a sequence of one or more bytes representing a member of the extended character set) and "wide character" (a value of type wchar_t).

"Bytes" is less ambiguous, but "characters" matches the wording of the ISO C standard (and, in that context, refers to single-byte characters).

Signature · 5 lines
Keith Thompson <[email protected]>
--
To unsubscribe from this list: send the line "unsubscribe linux-man" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html