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

如何在程序中为scanf()提供输入以自动评分C语言作业?

解决VPL中自动为scanf提供输入的问题

你提到用fprintf(stdin,...)无效是正常的——stdin是只读的标准输入流,默认关联控制台输入,只能从中读取数据,不能写入,所以这个方法从根本上就行不通。针对VPL环境下的C语言作业自动评分,给你三种实用的解决方案:

方法1:Shell重定向输入(最简便)

在VPL的运行命令中,直接用重定向符号<把测试输入文件传给学生的编译后程序。比如:

  1. 先在评分脚本里生成包含测试答案的文本文件(比如test_input.txt),内容是你要给scanf的输入,每行一个数据;
  2. 执行学生程序时用命令:
./student_program < test_input.txt

这样学生程序里的scanf会自动从test_input.txt读取数据,无需修改学生代码。

方法2:管道传递输入(适合简单用例)

如果测试输入比较简短,不需要生成文件,可以用管道直接把输入传给程序。比如学生程序需要输入两个答案,用shell命令:

echo -e "4\n7" | ./student_program

echo -e用来解析换行符,多个输入用\n分隔即可。

方法3:用popen在评分程序中控制输入(动态生成用例)

如果你的评分程序是用C语言写的,需要动态生成测试输入,可以用popen函数启动学生程序并获取其标准输入的写入权限:

#include <stdio.h>

int main() {
    // 以写入模式启动学生程序,获取输入流
    FILE *student_proc = popen("./student_program", "w");
    if (student_proc == NULL) {
        perror("Failed to start student program");
        return 1;
    }

    // 写入测试输入,比如数学题的答案
    fprintf(student_proc, "4\n");
    fprintf(student_proc, "9\n");

    // 关闭进程并获取退出状态
    int status = pclose(student_proc);
    // 可以根据status判断学生程序的运行情况
    return 0;
}

这种方式能让你在评分逻辑里灵活控制输入内容和顺序,适合需要随机生成数学题并对应输入答案的场景。

内容的提问来源于stack exchange,提问作者J-K -L

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 17:15:58