Last byte of string has bit 7 set.
First byte of string has length, so strings are limited to 255 bytes in length.
First two bytes of string has length, so strings are limited to 65535 bytes in length.
Strings are stored in fixed length buffers with space padding to the end.
Length prefixed strings are stored in a fixed length buffer, so you are limited to the buffer length. I think this was the case for PL/I "varying" strings.
Back in the day, C was better than PASCAL because it had strdup, meaning it had a heap and you could put strings in it.
C++ string is mediocre. I solves some problems, but what if:
You have very long strings and you are worried about heap fragmentation. So you are better to have something like a linked list of segments each in their own malloc block. But can you extend std::string? Nope, oh well.
You want strings to be semipredicates. I mean that strings should be able to have a NULL value, as I can do with C. (return NULL for 'char *'). Can std::string do this? Nope. Can it be extended? Nope.