我將從我的用例開始。我是一名老師,我有學生爲我編寫非常簡單的C++控制檯程序。我想通過爲他們的整個應用程序編寫測試工具來自動分級他們的程序。當他們使用cin請求輸入時,我想給它。當他們使用cout我想能夠解析他們的輸出正確的功能。我很確定我的老師在大學時爲我們做了這個。什麼是這樣的好方法?有沒有更好的方法來驗證他們的代碼比解析輸出?我應該解析他們的實際代碼並尋找函數聲明嗎?謝謝。編寫一個程序來運行另一個書面程序
2
A
回答
0
你的問題是相當開放的,但你可能想要研究的一件事是C++系統命令。查看更多關於它的信息here。
3
我建議你不要發明輪子,並使用類似SPOJ Engine,see also這樣的東西,它具有以下所有必要功能:安全沙箱,提供僞造的用戶輸入等等。
0
假設你要像Linux或MacOS的/ X,forkpty(一POSIX-Y OS在做這個)將做到這一點很容易地看到...下面的示例在子進程中運行「ping 127.0.0.1」,並在它讀取()的時候輸出ping進程的stdout輸出。你可以在同一個文件描述符上使用write()寫入子進程的stdin。
Windows下也有類似的技術,但按照傳統,它的難度和難度要大10倍左右。讓我知道這是你需要做的事情。
#include <stdio.h>
#include <termios.h>
#include <unistd.h>
#if defined(__linux__)
# include <pty.h> // for forkpty() on Linux
#else
# include <util.h> // for forkpty() on MacOS/X
#endif
int main(int argc, char ** argv)
{
int fd;
pid_t pid = forkpty(&fd, NULL, NULL, NULL);
if (pid > 0)
{
// We're running in the parent process. We can now write to the child process
// (and read from it) via (fd).
while(1)
{
char buf[4096];
int numBytesRead = read(fd, buf, sizeof(buf)-1);
if (numBytesRead > 0)
{
buf[numBytesRead] = '\0'; // ensure termination
printf("Read from child process's stdout: [%s]\n", buf);
}
else if (numBytesRead == 0)
{
printf("Child process exited\n");
break;
}
else {perror("read"); break;}
}
}
else if (pid == 0)
{
// We're running in the child process.
// Turn off the echo, we don't want to see that back on stdout
struct termios tios;
if (tcgetattr(STDIN_FILENO, &tios) >= 0)
{
tios.c_lflag &= ~(ECHO | ECHOE | ECHOK | ECHONL);
tios.c_oflag &= ~(ONLCR); /* also turn off NL to CR/NL mapping on output */
(void) tcsetattr(STDIN_FILENO, TCSANOW, &tios);
}
char * const argv[] = {"/sbin/ping", "-c", "5", "127.0.0.1", NULL}; // Replace /sbin/ping with your favorite program to run instead
if (execvp(argv[0], argv) < 0) perror("execvp");
}
else if (pid < 0) perror("forkpty");
return 0;
}
0
這似乎是單元測試的一個很好的用法。編寫一些頭文件,爲頭文件定義的函數編寫單元測試,然後給學生提供頭文件和單元測試,並在測試通過之前拒絕爲工作評分。爲了進一步減少你的時間浪費,讓他們編譯一切與-Wall -Werror
。
一旦測試通過,我會查看代碼以確保它們沒有做任何邪惡的事情,只是爲了讓測試通過。
我見過的C++最好的單元測試框架是Google Test。編寫起來很簡單,而且易於運行。
在另一方面,如果所有你關心的是輸入和輸出,只需要使用bash和管道:
#!/bin/bash
for executable in * ; do
if cat input.txt | $executable | diff - expected-output.txt > /dev/null ; then
echo $executable passes
else
echo $executable fails
fi
done
相關問題
- 1. 編寫一個程序來瀏覽另一個程序
- 2. 如何編寫運行另一個GUI程序裏面
- 3. 如何編寫一個C程序來執行另一個程序?
- 4. 如何編寫一個程序來驗證另一個程序/腳本?
- 5. Java:最後運行另一個程序
- 6. 使用Python運行另一個程序
- 7. 如何編寫一個包含另一個程序的STDOUT和STDIN的程序?
- 8. 如何製作一個程序來操作另一個程序?
- 9. 編譯和運行一個Qt程序
- 10. 作了一個程序來編輯行
- 11. 運行一個程序
- 12. 製作一個C程序來編譯另一個
- 13. 獲取I /從另一個java程序運行Java程序Ø
- 14. 調用另一個程序在我的IDL程序中運行
- 15. 在另一個程序中運行程序?
- 16. 從另一個java程序運行RMI程序
- 17. 在另一個程序中運行UNIX程序
- 18. 從另一個程序集運行WPF應用程序
- 19. 運行Java程序到另一個程序
- 20. 如何從另一個java程序運行java程序?
- 21. 從另一個程序運行外部程序Linux或cygwin
- 22. 運行另一個C++程序的C++程序
- 23. 從C#安裝程序安裝程序運行另一個MSI
- 24. 正在運行另一個程序的調試程序
- 25. 從另一個Java程序運行java程序
- 26. 如何從C++程序運行另一個程序
- 27. 無法從另一個Java程序運行java程序
- 28. 執行來自tidesdk程序的另一個程序的命令
- 29. 一個程序,可以與另一個程序進行交互
- 30. 如何編寫一個bash腳本來提供另一個程序響應
慶典將是可能最簡單的方法。如果您堅持使用C/C++,那麼首先您需要管道文件描述符,以便您可以通過自己的函數向其0(in)和1(out)文件描述符提供數據。 –
請不要僅根據此自動過程的結果對它們進行分級。 –
這是你的工作和職業責任,所以請親自去做:) – valdo