从管道读取输入时出现scanf问题

时间:2012-10-16 03:06:04

标签: c++ c

我正在用C编写程序,我正在尝试创建一个自动化测试程序。将产生一个进程,其I / O通道(stdin,stdout和stderr)将被重定向到“黑盒测试模块”。 让我们假设一个涉及两个数相乘的简单程序。在这种情况下,要测试的程序如下所示:

#include<stdio.h>
int main()
{
    int a, b, numTc, i = 0; //numTc being the number of test cases
    scanf("%d",&numTc);
    for(;i < numTc; i++)
    {
        scanf("%d%d",&a,&b); //Facing issue here
        printf("%d\n",a*b);
    }
}

黑盒测试模块首先将此程序的I / O通道重定向到管道,然后使用write()系统调用首先编写测试用例的数量,然后是测试用例本身。

我面临的问题是: 该过程挂在第二个scanf上,如上所示。如果我构造整个输入缓冲区并在追加“\ n”后将其写入管道,那么事情就可以了。

但是,我想逐个实现这个功能。

以下是黑匣子模块的逻辑:

  1. 从数据库中读取总测试用例
  2. 构造一个输入缓冲区,其中所有测试用例由空格分隔,并以换行符结束。
  3. 将此缓冲区写入外部(待测试进程)进程的stdin
  4. 等待测试过程的输出。
  5. 以上工作正常。但是,黑匣子模块应该能够逐个编写测试用例。

2 个答案:

答案 0 :(得分:2)

您是否正在尝试读取彼此相邻的两个单位数整数?如果是这样,您可以考虑使用%1d

有一个输入示例会很有帮助。

答案 1 :(得分:0)

您的问题很可能是管道的标准I / O行为与标准I / O到终端的行为不同。写入终端时默认为线路缓冲;写入管道时它是完全缓冲的。因此,您的程序需要fflush(stdout);printf()实际向管道发送数据。

严格来说,您应该检查scanf()的返回值,以确保获得预期效果。如果第一个scanf()没有返回1或第二个没有返回2,那么你就会遇到问题。

您可以通过打开日志文件来查看正确读取的内容,从而调试问题。确保将输出刷新到该日志文件。