You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows平台是否有与BSD strndup()等效的原生C API函数?

Windows平台原生C API替代BSD strndup()的方案

Windows平台的原生C标准库没有提供与BSD strndup()完全同名的函数,但可以通过两种方式实现完全等效的功能:

  • 使用CRT内置的_strndup函数
    从Visual Studio 2015开始,微软C运行时库(CRT)提供了_strndup函数,行为和BSD strndup()完全一致:从输入字符串最多复制n个字符,且始终确保返回的字符串以NUL结尾。使用时需包含<string.h>头文件,示例代码:

    #include <string.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    int main() {
        const char* src = "Hello, Windows!";
        char* dst = _strndup(src, 5);
        if (dst != NULL) {
            printf("%s\n", dst); // 输出 "Hello"
            free(dst); // 必须手动释放内存
        }
        return 0;
    }
    

    若使用旧版本VS,需预先定义_CRT_NON_CONFORMING_STRNDUP宏才能启用该函数。

  • 手动组合API实现兼容方案
    要兼容更早期的Windows环境,可通过strnlen、malloc和strncpy组合实现:

    #include <string.h>
    #include <stdlib.h>
    
    char* my_strndup(const char* s1, size_t n) {
        size_t copy_len = strnlen(s1, n);
        char* result = malloc(copy_len + 1);
        if (result == NULL) {
            return NULL;
        }
        strncpy(result, s1, copy_len);
        result[copy_len] = '\0';
        return result;
    }
    

    这段代码先计算实际需要复制的字符数(最多n个),分配足够内存后复制字符,最后手动添加NUL终止符,完美复刻strndup()的逻辑。

内容的提问来源于stack exchange,提问作者Graham Leggett

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 05:15:56