簡體   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