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中的符*无区别,只是writelnprintf%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)结尾的串.

posted @   zjh6  阅读(25)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示