[入门] 从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"); |