Thread overview
args.length problem
Feb 18, 2005
jicman
Feb 18, 2005
brad beveridge
Feb 18, 2005
jicman
Feb 18, 2005
Nick
Feb 20, 2005
Regan Heath
February 18, 2005
Greetings D people!

Let us use this sample code:

import std.string;
int main(char[][] args)
{
char[] a = std.string.toString(args.length);
printf(a);
return (0);
}
after a successful compile, a run with different arguments print the weirdest
outcome!  ie.

No arguments:
14:57:36.62>test
123456789

4 arguments:
14:57:38.89>test 0 1 2 3
56789

So, is there an specific way to get the number of arguments given to a program? I mean, I can get it from this, but I can anyone explain why this is printing instead of 4?

thanks.

josé


test


February 18, 2005
> import std.string;
> int main(char[][] args)
> {
> char[] a = std.string.toString(args.length);
> printf(a);
> return (0);
> }

A char[] is not the same as the char * that printf expects.
    printf("%.*s\n", a);
worked fine for me.

Brad
February 18, 2005
I've also tried this code:
import std.string;
int main(char[][] args)
{
if (args.length ==0) printf("0 argument\n");
if (args.length ==1) printf("1 argument\n");
if (args.length ==2) printf("2 arguments\n");
if (args.length ==3) printf("3 arguments\n");
if (args.length ==4) printf("4 arguments\n");
if (args.length ==5) printf("5 arguments\n");
char[] a = std.string.toString(args.length);
printf(a);
return (0);
}

and here is the output:

No arguments:
15:10:31.12>test
1 argument
123456789

So, every d program has at least one argument: the program itself. args[0].

here is with 1 argument:

15:10:34.09>test 1
2 arguments
23456789

Ok, never mind... I answered my own question. :-)

thanks.

josé

In article <cv5hj5$glo$1@digitaldaemon.com>, jicman says...
>
>
>Greetings D people!
>
>Let us use this sample code:
>
>import std.string;
>int main(char[][] args)
>{
>char[] a = std.string.toString(args.length);
>printf(a);
>return (0);
>}
>after a successful compile, a run with different arguments print the weirdest
>outcome!  ie.
>
>No arguments:
>14:57:36.62>test
>123456789
>
>4 arguments:
>14:57:38.89>test 0 1 2 3
>56789
>
>So, is there an specific way to get the number of arguments given to a program? I mean, I can get it from this, but I can anyone explain why this is printing instead of 4?
>
>thanks.
>
>josé
>
>
>test
>
>


February 18, 2005
In article <cv5hj5$glo$1@digitaldaemon.com>, jicman says...
>
>
>Greetings D people!
>
>Let us use this sample code:
>
>import std.string;
>int main(char[][] args)
>{
>char[] a = std.string.toString(args.length);
>printf(a);
>return (0);
>}

Don't use printf, use writefln. You need to import std.stdio first.

(Then why is printf there you ask? Yes it's stupid, and yes we know :)

Nick


February 20, 2005
On Fri, 18 Feb 2005 20:01:41 +0000 (UTC), jicman <jicman_member@pathlink.com> wrote:
> Greetings D people!
>
> Let us use this sample code:
>
> import std.string;
> int main(char[][] args)
> {
> char[] a = std.string.toString(args.length);
> printf(a);
> return (0);
> }
> after a successful compile, a run with different arguments print the weirdest
> outcome!  ie.
>
> No arguments:
> 14:57:36.62>test
> 123456789
>
> 4 arguments:
> 14:57:38.89>test 0 1 2 3
> 56789
>
> So, is there an specific way to get the number of arguments given to a program?
> I mean, I can get it from this, but I can anyone explain why this is printing
> instead of 4?
>
> thanks.
>
> josé

In case you, or anyone else is interested, the reasons for your results:

1. The toString function is optimised to return a slice of a static string, the static string reads "0123456789". In the first case you were given a slice from 1 onward, of length 1. In the second you were given a slice from 5 onward of length 1.

2. Printf expects a C string, that is a pointer to a bunch of char's terminated with a null char, D strings are not null terminated, instead they have a length.

3. Static D strings are in fact null terminated, which is why you didn't get a bunch of garbage after the 9 in each case.

So, to correctly print a D string using printf you use the method Brad has shown, or call toStringz to convert from a D string into a C string (i.e. add a null to the string).

Or you can use the method Nick has suggested.

Newcomers to D keep running into this, I suggest we move/remove printf from object.d and force people to import std.c.stdio to get it, then we ensure writef is documented (I'd rename std.stdio to std.io also).

Regan