我正在创建一个程序,它将接受源代码,编译它,并输入测试用例以查看程序是否正确。如果可能的话,源代码检查器。我用于编译程序的是通过cmd。我现在的问题是,一旦程序在cmd中运行,如何输入测试用例。 这实际上是我们学校的一个项目。所以教授会给出一个问题(例如输入一个整数,如果它是偶数或奇数),那么该程序将通过测试教授提供的测试用例来检查学生的源代码(例如输入:1输出:奇数,输入2:输出:偶数)。
这是我的示例代码(c#编译器)
case ".cs":
CsCompiler();
Run(path + "\\program");
break;
我的职能:
public static void CsCompiler() throws IOException, InterruptedException {
Process(path + "\\", " c:\\Windows\\Microsoft.NET\\Framework\\v3.5\\csc /out:program.exe *.cs");
}
public static void Process(String command, String exe) throws IOException, InterruptedException {
final Process p;
if (command != null) {
p = Runtime.getRuntime().exec(exe, null, new File(command));
} else {
p = Runtime.getRuntime().exec(exe);
}
new Thread(new Runnable() {
public void run() {
BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = null;
try {
while ((line = input.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
p.waitFor();
}
public static void Run(String command) throws IOException, InterruptedException {
String[] argss = {"cmd", "/c", "start", command};
ProcessBuilder pb;
pb = new ProcessBuilder(argss);
pb.start();
}
答案 0 :(得分:1)
如果我找对了你想要启动一个程序并在从java方法注入输入时获取其输出。实际上这非常简单,因为你已经在编译方法中进行了输出提取
Process
类还有getOutputStream
方法,您可以使用该方法为流程注入输入
我将通过一个例子说明如何做到这一点
将这个简单的C程序视为学生源代码,将数字作为输入并检查它是偶数还是奇数。
#include <stdio.h>
int main(){
int x;
printf("Enter an Integer Number:\n");
if (( scanf("%d", &x)) == 0){
printf("Error: not an Integer\n");
return 1;
}
if(x % 2 == 0) printf("even\n");
else printf("odd\n");
return 0;
}
现在实现这样的Run
方法来运行应用程序,注入输入,读取输出并检查返回值。
public static void Run(String command, String input) throws IOException, InterruptedException {
// create process
String[] argss = {"cmd", "/c", command};
ProcessBuilder pb = new ProcessBuilder(argss);
Process process = pb.start();
// create write reader
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
// write input
writer.write(input + "\n");
writer.flush();
// read output
String line = "";
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
// wait for process to finish
int returnValue = process.waitFor();
// close writer reader
reader.close();
writer.close();
System.out.println("Exit with value " + returnValue);
}
就是这样。如果你像这样调用这个方法
Run("NumberChecker.exe", "1");
Run("NumberChecker.exe", "2");
Run("NumberChecker.exe", "a");
您将获得以下输出
Enter an Integer Number:
odd
Exit with value 0
Enter an Integer Number:
even
Exit with value 0
Enter an Integer Number:
Error: not an Integer
Exit with value 1