[英]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”后将其写入管道,那么事情就可以了。
但是,我想逐个实现功能。
以下是黑匣子模块的逻辑:
以上工作正常。 但是,黑匣子模块应该能够逐个编写测试用例。
您是否正在尝试读取彼此相邻的两个单位数整数? 如果是这样,您可以考虑使用%1d
。
有一个输入的例子会很有帮助。
您的问题很可能是管道的标准I / O与标准I / O到终端的行为不同。 写入终端时默认为线路缓冲; 写入管道时它是完全缓冲的。 所以,你的程序需要fflush(stdout);
printf()
之后实际向下发送数据管道。
严格来说,你应该检查scanf()
的返回值,以确保你得到你期望的。 如果第一个scanf()
没有返回1或第二个没有返回2,那么你就遇到了问题。
您可以通过打开日志文件来查看正确读取的内容,从而调试问题。 确保将输出刷新到该日志文件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.