d和c的符区别
#include <stdio.h>
#include <stdlib.h>
int main()
{
char ch[]="你好,世界!";
char *p;
p=&ch;
p++;
printf("%s\n", p);
return 0;
}
上为C版,下为D版:
module main;
import std.stdio;
int main(string[] args)
{
char[] ch="你好,世界!".dup;
char *p;
p=&ch[0];
p++;
writefln("%s", p);
return 0;
}
如下,与你一样:
import core.stdc.stdio;
void main()
{
const(char)[] ch = "你好,世界!";
const(char)* p;
p = &ch[0];
p++;
printf("%s", p);
}
用writefln,再来:
import std;
import core.stdc.string;
void main()
{
const(char)[] ch = "你好,世界!";
const(char)[] ch2 = "abc";
const(char)* p;//串字面需要`const(char)`.
p = &ch[0];
p++;
auto str = p[0 .. strlen(p)];
writefln("%s", str);//writefln需要切片.
}
C和D中的符*无区别,只是writeln与printf的%s有区别,文档
%s来格式化输出.对D串,看到文本.对整数或浮点类型,会看到数字.对指针,会看到地址等等.
示例中,要writefln打印文本而不是指针地址,可导入std.string并使用fromStringz(p).
对p指向的任意不变切片.这给你D串而不分配内存.如果想在指针生命期外继续使用串,则必须使用std.conv.to,而不是(如,to!string(p)).
这是D方法:
int main(string[] args)
{
string ch1 = "你好,世界!";
char[] ch2="你好,世界!".dup;
string s1=ch1[1..$];
char[] s2=ch2[1..$];
writeln(s1);
writeln(s2);
return 0;
}
如果,不返回char*.可只使用writeln(p1);来输出整个串,或使用p1[0..$]切片来取整个串,因而不必用strlen.
strlen仅适合以空字符(\0)结尾的串.
浙公网安备 33010602011771号