0
点赞
收藏
分享

微信扫一扫

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)​​结尾的串.


举报

相关推荐

0 条评论