如何在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
相关产品推荐
相关产品推荐

