使用C风格的字符串调用C函数

 男人还是闷骚点好 发布于 2023-02-13 17:21

我很难打电话给mktempD:

import core.sys.posix.stdlib;
import std.string: toStringz;
auto name = "alpha";
auto tmp = mktemp(name.toStringz);

但我无法弄清楚如何使用它,所以DMD抱怨:

/home/per/Work/justd/fs.d(1042): Error: function core.sys.posix.stdlib.mktemp (char*) is not callable using argument types (immutable(char)*)

如何创建可变的零终止C样式字符串?

我想我已经在某处读过字符串文字(constimmutable)可以隐式转换为零(空)终止字符串.

2 个回答
  • 除了Adam的好答案之外,还有std.utf.toUTFz,在这种情况下你可以做

    void main()
    {
        import core.sys.posix.stdlib;
        import std.conv, std.stdio, std.utf;
    
        auto name = toUTFz!(char*)("alphaXXXXXX");
        auto tmp = mktemp(name);
        writeln(to!string(tmp));
    }
    

    std.utf.toUTFzIS std.string.toStringz的多种能够表妹,因为它会产生空值终止的UTF-8,UTF-16,和UTF-32的字符串(而不是仅仅UTF-8)以及常量性的任何水平.缺点是,对于您想要的情况,它更加冗长immutable(char)*,因为您必须指定返回类型.

    但是,如果效率是一个问题,Adam的解决方案可能更好,因为它避免了必须分配您传递到mktemp堆上的C字符串.toUTFz但是,如果你不关心在堆上分配C字符串的效率成本(并且大多数程序可能不会),那么toUTFz可以说更好.这取决于您的特定计划的要求.

    2023-02-13 17:23 回答
  • 对于这个特定问题:

    这是因为mktemp需要写入字符串.来自mktemp(3):

    模板的最后六个字符必须是XXXXXX,并且这些字符将替换为使文件名唯一的字符串.由于它将被修改,因此模板不能是字符串常量,而应声明为字符数组.

    所以你想要做的是使用char []而不是字符串.我会去:

    import std.stdio;
    
    void main() {
        import core.sys.posix.stdlib;
    
        // we'll use a little mutable buffer defined right here
        char[255] tempBuffer;
        string name = "alphaXXXXXX"; // last six X's are required by mktemp
        tempBuffer[0 .. name.length] = name[]; // copy the name into the mutable buffer
        tempBuffer[name.length] = 0; // make sure it is zero terminated yourself
    
        auto tmp = mktemp(tempBuffer.ptr);
        import std.conv;
        writeln(to!string(tmp));
    }
    

    通常,创建可变字符串可以通过以下两种方式之一完成:一种是.dup一些东西,另一种是像我上面那样使用堆栈缓冲区.

    toStringz不关心输入数据是否可变,它总是返回不可变(显然......).但是你自己很容易做到:

    auto c_str = ("foo".dup ~ "\0").ptr;
    

    这就是你如何做的,.dup制作一个可变副本,并自己添加零终止符确保它存在.

    string name = "alphaXXXXXX"; // last six X's are required by mktemp
    auto tmp = mktemp((name.dup ~ "\0").ptr);
    

    2023-02-13 17:23 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有