strings and char arrays

Robert Fraser fraserofthenight at gmail.com
Mon May 5 17:08:57 PDT 2008


llee wrote:
> With the release of dmd 2, char arrays have been replaced with strings.Many of the standard functions within Phobos no longer accept character 
arrays, and the strings that have replaced them are not terminated with 
null characters - making them incompatable with c functions. Equally 
important strings are immutable, meaning that they can not be modified 
after they are defined, and old code that used the word string for 
variable names and references no longer work. Why have strings been 
introduced? Why are they being used to replaced character arrays when 
they suffer from these limitations and introduce these problems? And, 
how can we convert between char arrays, and strings?

strings _are_ character arrays, just immutable ones. D's char[]s and C's 
char*s were never compatible -- D's arrays keep a length in them, which 
takes up a little bit more memory but makes a surprising number of 
operations more efficient.

In D2, the concept of invariantness was introduced, and the identifier 
"string" was aliased to mean invariant(char)[]. There have been numerous 
arguments about whether this is a good choice or not, start browsing 
this newsgroup if you're curious. The main arguments are that invariant 
is more efficient and people have an easier time thinking of strings as 
immutable entities.

To convert...
char* -> char[]                         -- fromStringz(x)
char[] -> char*                         -- toStringz(x)
invariant(char)[] -> char[] (copy made) -- x.dup
invariant(char)[] -> char[] (no copy)   -- cast(char[]) x
char[] -> invariant(char[]) (copy made) -- x.idup
char[] -> invariant(char)[] (no copy)   -- cast(invariant) x

Remember that string and invariant(char)[] are interchangeable



More information about the Digitalmars-d mailing list