Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

strlen - the length of the string is sometimes increased by 1

Tags:

c

string

strlen

I'm doing some C puzzle questions. In most cases, I am able to find the right answer, but with that one I am having problems. I know the right answer by using the compiler, but I don't know the reason.

Have a look at the code:

char c[] = "abc\012\0x34"; 

What would strlen(c) return, using a Standard C compiler?

My compiler returns 4 when what I expected was 3.

What I thought is strlen() would search for the first occurrence of the NULL character but somehow the result is one more than I expected.

Any idea why?

like image 282
Prz3m3k Avatar asked Jan 10 '13 18:01

Prz3m3k


People also ask

What is the length of string in strlen function?

The strlen() function calculates the length of a given string. The strlen() function takes a string as an argument and returns its length. The returned value is of type size_t (an unsigned integer type). It is defined in the <string. h> header file.

What is the use of strlen () function?

The strlen() function determines the length of string excluding the ending null character. The strlen() function returns the length of string . This example determines the length of the string that is passed to main() .

Can we use strlen with string?

For C++ strings, there's no reason to use strlen . Just use string::length : Clarity: The length() (or size() ) member functions unambiguously give back the length of the string.

Why is the size of character arrays declared one more than the largest string they can hold?

The maximum index value of most arrays, therefore, is one less than its numerical value. It's same with a string, but since it has an extra character at the end, it gets incremented by one. So, the string length is the same as the number of characters in it.


1 Answers

Let's write

char c[] = "abc\012\0x34"; 

with single characters:

char c[] = { 'a', 'b', 'c', '\012', '\0', 'x', '3', '4', '\0' }; 

The first \0 you see is the start of an octal escape sequence \012 that extends over the following octal digits.

Octal escape sequences are specified in section 6.4.4.4 of the standard (N1570 draft):

octal-escape-sequence:
\ octal-digit
\ octal-digit octal-digit
\ octal-digit octal-digit octal-digit

they consist of a backslash followed by one, two, or three octal digits. In paragraph 7 of that section, the extent of octal and hexadecimal escape sequences is given:

7 Each octal or hexadecimal escape sequence is the longest sequence of characters that can constitute the escape sequence.

Note that while the length of an octal escape sequence is limited to at most three octal digits (thus "\123456" consists of five characters, { '\123', '4', '5', '6', '\0' }), hexadecimal escape sequences have unlimited length

hexadecimal-escape-sequence:
\x hexadecimal-digit
hexadecimal-escape-sequence hexadecimal-digit

and thus "\x123456789abcdef" consists of only two characters ({ '\x123456789abcdef', '\0' }).

like image 144
Daniel Fischer Avatar answered Sep 20 '22 18:09

Daniel Fischer