簡體   English   中英

fgets不阻止輸入-C

[英]fgets not blocking for input - C

我正在為學校編寫程序; 這是我第一次與C合作。

我正在使用fgets讀取輸入,但有時fgets不會阻塞(將程序陷入無限循環)。 要回答每個人的第一個問題,不,我沒有在剩下多余的\\n之前使用scanf,這會導致此問題。 我曾經使用sscanf,但這與fgets關聯,因此我認為這不是問題。

已經提供了一些處理套接字的代碼。 我已經瀏覽了一下,但是找不到問題的根源。 由於長度原因,未包含該代碼,但如果有幫助,我可以將其包含在內。

長話短說,除了scanf問題外,fgets是否有任何理由不會阻止輸入? 任何幫助表示贊賞!

編輯:我應該早些時候弄清楚這一點,但是在這種情況下,我僅將fgets用於stdin。

與C語言中的大多數標准函數一樣,您需要做一些挖掘來弄清楚正在發生的事情。 最好的起點是功能文檔。

fgets()文檔

從該文檔中,我們可以看到fgets接受三個參數並返回一個char *。 假設參數正確,函數將從流中讀取數據,直到到達換行符或文件標記的末尾。 如果成功,則返回代碼將是指向str參數的指針。

但是,您可能更感興趣的情況是失敗情況。 失敗時,該函數返回NULL。 要確定故障發生的確切程度,您需要檢查文件錯誤指示符,並查看其是否已打印消息。 可以按照以下步驟進行:

if ( fgets (mystring , 100 , pFile) == NULL )
{
    // We handle error here
    if (ferror (pFile))
    {
        printf ("We encountered an error!\n");
        perror ("Error message");
    }
}

從這里,您應該能夠確定正在發生的事情。 可能的原因是參數無效或參數不是預期的格式/條件。

我知道這是一個比較老的問題,但是我想我會分享我遇到這個問題時發現的內容。 沒有您的代碼,我無法確定這是否與您遇到的問題相同,但是在我自己的代碼中發現的是,我對設置為0的文件描述符使用close() 。很好奇,我查找了什么文件描述符0在系統中,並且標准輸入為FD 0( http://en.wikipedia.org/wiki/File_descriptor )。 我敢肯定有很多方法可以解決這個問題,但是在我的案例中,我使用了一個簡單的if語句圍繞我的close:

if(fd > 2)
{
close(fd);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM