如何在C语言中模拟用户输入

4

希望这是一个简单的问题。我有一个函数,它会不断提示用户输入(字符),并在满足特定条件下返回一个字符。我正在为此编写测试以及其他类似的函数,但不知道如何模拟用户输入。顺便说一下,我使用scanf()获取用户输入。


1
将东西放入输入流中? - user684934
可能是如何对涉及IO的C函数进行单元测试?的重复问题。 - Valryne
6个回答

7

您可以使用freopen来更改标准输入的行为,以从文件中读取。将测试输入放入文件中,在测试之前调用此函数。

freopen("filename", "r", stdin);

这对我来说是有效的,但为什么当我尝试使用fputs()或fprintf()进行类似操作时它不起作用呢?例如:'fputs("string\n", stdin);' - Andy Alt
1
你试图将字节写入输入流,并期望它像堆栈一样工作。这对于启用读写模式的文件打开操作是有效的,但不适用于初始化为进程的 stdin - Tugrul Ates

3
您可以使用以下方法之一:

echo -e "测试字符串\n另一个字符串" | ./a.out

echo 命令的字符串应按程序所需的顺序排列

cat test_str_file | ./a.out

test_str_file 文件应按程序所需的顺序包含测试字符串

另一方面,您可以将代码的输入部分替换为一些虚拟部分。如果您有单独的输入模块,则可以用虚拟模块替换它。


1

如果你在Unix或Cygwin上,你可以调用可执行文件并要求它使用文本文件作为标准输入。例如:

bash$ ./a.out < input_file

0

将验证移动到另一个函数中,并独立测试它。或者伪造用户输入,重构剩余部分以接受一个函数指针,该指针被回调以收集一些字母。这应该可以实现简单的伪造。

我已经很久没有写C了,但是类似这样的方法也可以起作用。

/* test this independentaly */
int isvalid(char* chars){ 
  /* do stuff and return result */
}

/*real function */
char* getinput() {
  scanf(....)
  return stuff_from_scanf;
}



/*fake/mock function */
char* getinputFake(char * testString) {
   return testString;
}


test() {
 int result = isvalue(getinputFake("test data"));
 /* rest of test */
}

你不需要测试scanf函数,但是你可以用fscanf替换它,并像这样传入字符流

stdin

char* getinput(FILE * stream) {
   fscanf(stream....)
   return stuff_from_fscanf;
}


test() {
 FILE * stream = .....; /*create a dummy stream say from */
 int result = isvalue(getinput(stream);
 /* rest of test */
}

0

这是一个非常天真的解决方案,但它可能会做你想要的事情:

char getFakeUserInput()
{
    static char* fakeInput = "This is some user input\n";
    static int pos = 0;

    if(pos >= strlen(fakeInput))
        return '\0';

    return fakeInput[pos++]
}

0

为什么不用默认值直接调用函数呢?


该函数从文件中读取数据,而不是通过参数调用数据。 - luser droog
问题不是说它使用scanf吗? - pradeek
是的,但scanf是一个“输入”函数。数据在文件中,而不是在参数中。 - luser droog

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接