繁体   English   中英

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

[英]scanf issue when reading input from pipe

我正在用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. 等待测试过程的输出。

以上工作正常。 但是,黑匣子模块应该能够逐个编写测试用例。

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

有一个输入的例子会很有帮助。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM