Re: If C had a string type managed by the compiler...
> a lot of other languages ... there is a more full-featured option as default
Absolutely. And more power to them.
However, the question was about C (and C++), which - we all admit - has only the absolute bare minimum work done by the compiler to deal with the necessary evil of allowing (static) constant strings to be defined in your source code.
> Only some types of programs can use the model you describe
True.
Then again, that is trivially true for every single model you could ever describe. The interesting bit is whether the "some type" is a large number of programs (or even a large subset of programs).
> All the strings going back and forth to that will either be C strings...
When you look at it, all those inter-library strings tend to be passed as a buffer+length pair (preferably also null-terminated, if not hope for a better library) or even buffer+bufsize+strlen. In really well-behaved cases you can get a lock token included as well. Yes, often using a struct to keep that info together, but that doesn't imply that struct actually is "their own internal format", just a simple way to pass the data between libraries. The "pointer to a null terminated buffer" also happens to be a C string, useful for a quick printout.
All of which sounds terribly nasty to deal with, but: you get exactly the same effect with other forms of data, once you get beyond simple numerics; anything that can be a non-trivial size. Strings are not unique in that respect[1]. So image handling libraries all have their own formats (some choose to be compatible with a.n.other popular library, which is fine - until that library changes it's format or just gets overshadowed by the next big thing). Again, when you need to pass images from one library to another, you tend to end up being handed a buffer plus some metadata and you do the impedance matching as necessary.
[1] although you can argue that more people use strings than any other type, but I'd suggest looking at how many actually manipulate strings[2] versus just spitting out fixed text: hello_world.c doesn't do any string processing, the M4 macro processor does.
[2] I'd also look at how many (try to) write code to manipulate strings when they really don't need to. A lot of code will (sensibly) pass image handling over to a subprocess using, say, ImageMagick via it's executable, rather than linking it in as a library. Ditto ffmpeg or cURL. If you are really doing a lot of work to manipulate strings and your main program is in C, you can do a lot worse than invoking a specialised string footling program rather than a library.