digitalmars.D - args.length problem
- jicman (23/23) Feb 18 2005 Greetings D people!
- brad beveridge (4/11) Feb 18 2005 A char[] is not the same as the char * that printf expects.
- jicman (28/51) Feb 18 2005 I've also tried this code:
- Nick (4/13) Feb 18 2005 Don't use printf, use writefln. You need to import std.stdio first.
- Regan Heath (20/45) Feb 20 2005 In case you, or anyone else is interested, the reasons for your results:
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
Feb 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
Feb 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
Feb 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
Feb 18 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
Feb 20 2005









brad beveridge <brad nowhere.com> 