[入门] 从hollo world 开始,就遇到问题

achun 2007-04-20
int main(char[][] args)
{
    printf("hello world\n");
    printf("args.length = %d\n", args.length);
    for (int i = 0; i < args.length; i++)
printf("args[%d] = '%s'\n", i, cast(char *)args[i]);
    return 0;
}
同样的一段代码phobos下
hello.exe
结果:args[0] = 'd:\d\prj\hello\hello.exe'
tango 0.97下
结果:args[0] = 'hello.exe?P'
这最后是一个笑脸(0.96连最后的'都没有了)
呵呵,怎么会这样?
oldrev 2007-04-20
你连数组和指针都没分清
achun 2007-04-20
oldrev 写道
你连数组和指针都没分清


这和数组,指针分清没分清有关系么?
char[][]定义的是动态数组
printf函数要求一个指针,所以才有cast(char *)
那tango下用
Stdout.format ("{0}\n", args[i]);
好了打印出来的结果同样一个有路径一个没有路径,

我问
phobos和tango的差异有这么大么?
1.OS传过来的参数都不一样了
2.printf都不一样了
oldrev 2007-04-20
achun 写道
oldrev 写道
你连数组和指针都没分清


这和数组,指针分清没分清有关系么?
char[][]定义的是动态数组
printf函数要求一个指针,所以才有cast(char *)
那tango下用
Stdout.format ("{0}\n", args[i]);
好了打印出来的结果同样一个有路径一个没有路径,

我问
phobos和tango的差异有这么大么?
1.OS传过来的参数都不一样了
2.printf都不一样了

关系大了去了。
D的数组不是指针,数组中包含了数组的长度。
接近正确的做法应该是用
printf("%s", args[i].ptr); //危险!

由于D中的字符串没有 '\0' 结尾,因此调用 C 语言的字符串处理函数之前必须 toStringz,否则结果是未定义的。
正确做法:
import std.string; // 替换为 Tango 对应模块
printf("%s", toStringz(args[i]));

最佳做法还是用 Cout 或 writefln
achun 2007-04-20
谢谢你的解释
.....调用 C 语言的字符串处理函数之前.....
明白了你的意思了,
不过这是D samples里的例子呀!
printf("args[%d] = '%s'\n", i, cast(char *) args[i]);
这种写法,怎么讲也讲的通
cast(char *) 干的就是转换这个活,这都干不好的话.....
不过在phobos和tango下结果就是不一样.

是tango库更忠于D,更远离C么?
qiezi 2007-04-20
cast(char*)转换和直接str.ptr是一样的,不保证有\0结尾,除非运气好刚好碰上一个。
qiezi 2007-04-20
这个是给CORBA用的,不过可以看看里面的ridl是做什么的,如果是idl解析器就爽了
player7 2007-04-20
各位,那
printf("hello world");

字串常量是自动转换成C格式的吧?
qiezi 2007-04-20
qiezi 写道
这个是给CORBA用的,不过可以看看里面的ridl是做什么的,如果是idl解析器就爽了

这个回复回错位置了。。
qiezi 2007-04-20
player7 写道
各位,那
printf("hello world");

字串常量是自动转换成C格式的吧?

是自动转换,但不保证有\0结尾。你有2个做法:
printf(std.string.toStringz("hello world"));

printf("hello world\0");
Global site tag (gtag.js) - Google Analytics