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

如何在C语言中直接将字符数组赋值给stdin?

直接将字符数组推入stdin的优雅实现

不需要依赖临时文件,有几种跨平台或平台特定的优雅方案:

POSIX系统(Linux、macOS、BSD等)

方法1:使用管道重定向

通过创建匿名管道,将字符数组写入管道写端,再把管道读端绑定到stdin,后续的标准输入读取函数(如fgets、scanf)会自动从字符数组获取数据:

#include <stdio.h>
#include <unistd.h>
#include <string.h>

int main() {
    char input_data[] = "Hello from char array!\n123 456\n";
    int pipe_fd[2];

    // 创建匿名管道
    if (pipe(pipe_fd) == -1) {
        perror("pipe failed");
        return 1;
    }

    // 替换stdin为管道读端
    close(STDIN_FILENO);
    if (dup2(pipe_fd[0], STDIN_FILENO) == -1) {
        perror("dup2 failed");
        return 1;
    }
    close(pipe_fd[0]); // 复制后关闭多余的读端

    // 向管道写入字符数组内容
    write(pipe_fd[1], input_data, strlen(input_data));
    close(pipe_fd[1]); // 写完关闭写端,避免读操作阻塞

    // 测试读取stdin
    char buf[100];
    while (fgets(buf, sizeof(buf), stdin) != NULL) {
        printf("Read from stdin: %s", buf);
    }

    return 0;
}

方法2:使用内存流fmemopen

直接创建基于内存缓冲区的FILE流,替换stdin指针,操作更简洁:

#include <stdio.h>
#include <string.h>

int main() {
    char input_data[] = "Test input\nLine 2\n";
    // 创建从字符数组读取的内存流
    FILE *mem_stream = fmemopen(input_data, strlen(input_data), "r");
    if (!mem_stream) {
        perror("fmemopen failed");
        return 1;
    }

    // 保存原stdin,替换为内存流
    FILE *old_stdin = stdin;
    stdin = mem_stream;

    // 测试读取
    char buf[50];
    while (fgets(buf, sizeof(buf), stdin) != NULL) {
        printf("Got: %s", buf);
    }

    // 恢复原stdin并清理资源
    fclose(mem_stream);
    stdin = old_stdin;

    return 0;
}

Windows系统

使用Windows API创建匿名管道,重定向标准输入:

#include <stdio.h>
#include <windows.h>
#include <string.h>

int main() {
    char input_data[] = "Windows test input\n789\n";
    HANDLE read_handle, write_handle;
    SECURITY_ATTRIBUTES sa = {sizeof(SECURITY_ATTRIBUTES), NULL, TRUE};

    // 创建匿名管道
    if (!CreatePipe(&read_handle, &write_handle, &sa, 0)) {
        fprintf(stderr, "CreatePipe failed: %lu\n", GetLastError());
        return 1;
    }

    // 将管道读端设置为标准输入
    if (!SetStdHandle(STD_INPUT_HANDLE, read_handle)) {
        fprintf(stderr, "SetStdHandle failed: %lu\n", GetLastError());
        return 1;
    }

    // 写入字符数组到管道
    DWORD bytes_written;
    if (!WriteFile(write_handle, input_data, strlen(input_data), &bytes_written, NULL)) {
        fprintf(stderr, "WriteFile failed: %lu\n", GetLastError());
        return 1;
    }
    CloseHandle(write_handle); // 写完关闭写端

    // 测试读取stdin
    char buf[100];
    while (fgets(buf, sizeof(buf), stdin) != NULL) {
        printf("Read from stdin: %s", buf);
    }

    CloseHandle(read_handle);
    return 0;
}

这些方案完全在内存中完成数据传递,不会生成任何临时文件,高效且无残留文件问题。

内容的提问来源于stack exchange,提问作者Tong Zhao

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 03:00:56