如何将Shell中binaryOutput的输出作为C语言数组的输入?
如何捕获另一个C程序的输出并转为数组输入
嘿,用system()确实能运行你的binaryOutput程序,但它只能返回进程的退出状态,没法直接拿到输出内容。要实现捕获输出并转成数组的需求,popen()才是更合适的工具——它会帮你创建一个管道,让你像读取普通文件一样读取子进程的输出。
下面是一个完整的示例代码,我会一步步给你解释:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/wait.h> // 用于WIFEXITED和WEXITSTATUS宏 #define MAX_NUMBERS 100 // 根据你的实际输出数量调整这个值 int main() { // 打开管道,以只读模式运行binaryOutput FILE *pipe = popen("./binaryOutput", "r"); if (!pipe) { perror("无法创建管道"); return EXIT_FAILURE; } char output_buffer[256]; // 存储读取到的输出内容 int result_array[MAX_NUMBERS]; int array_count = 0; // 读取输出(假设输出是单行内容,多行的话可以循环调用fgets) if (fgets(output_buffer, sizeof(output_buffer), pipe) != NULL) { // 用空格、[、]作为分隔符拆分字符串 char *token = strtok(output_buffer, " []"); while (token != NULL && array_count < MAX_NUMBERS) { // 将字符串转为整数存入数组 result_array[array_count++] = atoi(token); token = strtok(NULL, " []"); } } // 关闭管道并检查子进程的退出状态 int exit_status = pclose(pipe); if (exit_status == -1) { perror("关闭管道失败"); return EXIT_FAILURE; } // 检查binaryOutput是否正常退出 else if (WIFEXITED(exit_status)) { int child_exit_code = WEXITSTATUS(exit_status); if (child_exit_code != 0) { fprintf(stderr, "binaryOutput运行出错,退出码:%d\n", child_exit_code); } } // 验证一下结果(你可以替换成自己的业务逻辑) printf("捕获到的数字数组:"); for (int i = 0; i < array_count; i++) { printf("%d ", result_array[i]); } printf("\n"); return EXIT_SUCCESS; }
关键部分解释:
popen():这个函数会fork一个子进程来运行./binaryOutput,同时创建一个管道连接子进程的标准输出和当前进程的FILE指针。参数"r"表示我们要读取子进程的输出。- 解析输出:用
strtok()拆分输出字符串,把[、]和空格都作为分隔符,这样就能提取出里面的数字字符串,再用atoi()转成整数存入数组。 pclose():一定要用这个函数关闭管道,而不是fclose(),它会等待子进程结束并返回退出状态,我们可以通过这个状态判断binaryOutput是否正常运行。
额外注意事项:
- 如果
binaryOutput的输出是多行的,你需要循环调用fgets()直到它返回NULL,再逐行解析。 - 要是不确定输出的数字数量,可以用动态内存分配(比如
malloc和realloc)来替代固定大小的数组,避免越界。 - 如果输出的数字格式有变化(比如出现非数字字符),要添加额外的校验逻辑(比如用
strtol替代atoi,同时检查转换是否成功)。
这样就能完美把binaryOutput的输出转成数组供你的程序使用啦!
内容的提问来源于stack exchange,提问作者JongHyeon Yeo
相关产品推荐
相关产品推荐

