string concatenation
Jonathan M Davis
jmdavisProg at gmx.com
Sat Apr 7 22:27:37 PDT 2012
On Sunday, April 08, 2012 07:08:09 dnewbie wrote:
> I have a wchar[] and I want to convert it to UTF8
> then append a string. This is my code.
>
> import std.c.windows.windows;
> import std.string;
> import std.utf;
>
> int main()
> {
> wchar[100] v;
> v[0] = 'H';
> v[1] = 'e';
> v[2] = 'l';
> v[3] = 'l';
> v[4] = 'o';
> v[5] = 0;
> string s = toUTF8(v) ~ ", world!";
> MessageBoxA(null, s.toStringz, "myapp", MB_OK);
> return 0;
> }
>
> I want "Hello, world!", but the result is "Hello" only. Please help me.
D strings are not null-terminated, so v[5] = 0 doesn't do anything to
terminate that string. The whole point of toStringz is to put a null character
on the end of a string (and allocate a new string if need be) and return a
pointer to it. C code will then use the null character to indicate the end of
the string, but D won't.
What you've done with
string s = toUTF8(v) ~ ", world!";
is create a string that is
['H', 'e', 'l', 'l', 'o', '\0', '\0', '\0', ...] (all of the characters up to
the v[99] are '\0')
and append
[',', ' ', 'w', 'o', 'r', 'l', 'd', '!']
to it. The result is a string whith is 108 characters long with a ton of null
characters in the middle of it. When you call toStringz on it, it may or may
not allocate a new string, but in the end, you have a string which is 109
characters long with the last character being '\0' (still with all of the null
characters in the middle) which you get an immutable char* pointing to.
So, when the C code operates on it, it naturally stops processing when it hits
the first null character, since that's how C determines the end of a string.
You can embed null characters in a string and expect C to operate on the whole
thing. And since D strings aren't null-terminated, you can't expect that
setting any of it their elements to null will do anything to terminate the
string in D or stop D functions from operating on the whole string. You have
to slice the static wchar array with the exact elements that you want if you
intend to terminate it before its end.
- Jonathan M Davis
More information about the Digitalmars-d-learn
mailing list