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

如何将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是否正常运行。

额外注意事项:

  1. 如果binaryOutput的输出是多行的,你需要循环调用fgets()直到它返回NULL,再逐行解析。
  2. 要是不确定输出的数字数量,可以用动态内存分配(比如malloc和realloc)来替代固定大小的数组,避免越界。
  3. 如果输出的数字格式有变化(比如出现非数字字符),要添加额外的校验逻辑(比如用strtol替代atoi,同时检查转换是否成功)。

这样就能完美把binaryOutput的输出转成数组供你的程序使用啦!

内容的提问来源于stack exchange,提问作者JongHyeon Yeo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:16:11