原文
#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)
结尾的串.