> it depends on what you mean by length. C programmers typically think > about the actual number of bytes they use, so length could mean a > couple of different things depending on the context. I am a C programmer - it's my day job. So let me clear up some (mis)understandings: 1 - A string is not an array in C. An array in C is a very specific thing, and is often misunderstood. An array in C is a thing declared as a fixed number of data items in size. That is only what an array is - nothing else. eg: "int array[10];" declares an array; "int *p;" does not. 2 - Array references decay transparently into pointers and vice-versa; hence, any sequence of memory can be iterated through either as an array (using array[X] notation) or as a pointer (using *(array + X) notation). 3 - C has no well-defined string type. Instead, there is a string library, which operates on 0-terminated pointers to char. A string is just a region of memory - this region could be an array, or it could just be a chunk of memory you choose to treat like a string. 4 - Arrays and strings in C are not orthogonal - which is why strings have their own library. To get the number of characters in a string, you use strlen(p); to get the number of bytes in an array, you use sizeof(array). To get the number of elements in an array (a fuzzy concept in C), you would have to use something like (sizeof(array) / sizeof(array[0])). 5 - You will note that strlen(p) IS NOT THE SAME as sizeof(p). If p is a pointer, sizeof(p) returns 2 or 4 or something. If p is an array, sizeof(p) returns the number of bytes in the declared array. strlen(p), on the other hand, returns the number of characters in the 0-terminated run of characters pointed at by p. 6 - string constants can be used to initialize arrays, such as `char s1[] = "Hello world!"`; however, they can also have a pointer set to them like `char s2 = "Hello world!"`. In these examples, strlen(s1) == strlen(s2) == 12; however, sizeof(s1) == 13 but sizeof(s2) == 4 Therefore, those who are arguing that the desire to treat arrays and strings orthogonally comes from a legacy C inheritance are wrong. IMO, the desire for orthogonality comes from the fact that both strings and arrays are SEQUENCE types. A good OO language will have a common set of operations for sequence types. For example, true string to list orthogonality really only exists in one language that I know of: Python: s = "Hello world!" a = [1, 2, 3, 4, 5] len(s) <- 12 len(a) <- 5 s[1:3] <- "el" a[1:3] <- [2, 3] In fact, one could argue that the separation of functionality for arrays and strings is an inheritance from C, rather than the other way around. Actually, though, the function "substr" does not occur in the standard C library; therefore, I suspect this legacy function comes from something like BASIC, where it does occur. - Jake B.