如何在程序中为scanf()提供输入以自动评分C语言作业?
解决VPL中自动为scanf提供输入的问题
你提到用fprintf(stdin,...)无效是正常的——stdin是只读的标准输入流,默认关联控制台输入,只能从中读取数据,不能写入,所以这个方法从根本上就行不通。针对VPL环境下的C语言作业自动评分,给你三种实用的解决方案:
方法1:Shell重定向输入(最简便)
在VPL的运行命令中,直接用重定向符号<把测试输入文件传给学生的编译后程序。比如:
- 先在评分脚本里生成包含测试答案的文本文件(比如
test_input.txt),内容是你要给scanf的输入,每行一个数据; - 执行学生程序时用命令:
./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
相关产品推荐
相关产品推荐

