簡體   English   中英

scanf在while循環中

[英]scanf in while loop

在此代碼中, scanf僅工作一次。 我究竟做錯了什么?

#include <stdio.h>
#include <unistd.h>

int main()
{
    int i = 1;
    if (! fork())
    {
        while(i)
        {
            printf("Enter i");
            scanf("%d", &i);
            fflush(stdin);
            fflush(stdout);
        }
    }
    else
    {
        printf("Parent\n");
    }
    return(0);
}

已經建議您不要使用scanf 如果您覺得必須使用scanf ,則實際上應該檢查返回值以確定轉換之前是否發生了輸入錯誤。

還應注意,您不應通過fflush刷新stdin ,因為它會調用未定義的行為。 如果您覺得必須沖洗stdin ,則可能要參考此問題的答案。

如果輸入了無效值(例如“ 1,234” ), scanf將接受“ 1” ,並且“,234 / n”將保留在輸入流中。 由於不能保證fflush(stdin)正常工作,因此隨后對scanf調用將一遍又一遍地拒絕相同的',' ,永遠不會取得任何進展。 如果檢查返回值是否為零(表示早期匹配失敗),則可以避免此無限循環。 在再次調用scanf之前,還必須從輸入流中刪除無效字符。


另請參見scanf()導致無限循環

嘗試檢查i> 0。

如果不查看您要提供的輸入,很難說。 如果它不使用fork則可能是如Amit所述的沖突。 不過,還有兩件事:

  1. 不要使用scanf

  2. fflush(stdin)未定義的行為 不要這樣

從comp.lang.c常見問題解答中:

父進程返回后,它將控制權交還給外殼,外殼可以自由關閉其stdin 即使stdin保持有效並處於活動狀態,用戶也會收到混亂的shell提示。

要保留孩子對stdin / out的訪問權限,您需要阻止父進程終止直到孩子完成操作。 使用wait或相關功能。

#include <sys/wait.h>

...

else {
    printf( "parent\n" );
    wait( NULL );
}

這可以修復您在我的機器上的錯誤。 我不是Unix文件描述符語義方面的專家,但是看來生成的程序可能是可移植的。 為什么要這樣做是另一回事...

首先,我嘗試提取出最簡單的代碼來解決這個問題(長時間不使用C / scanf)。 沒有fork的代碼可以正常工作。 一個小小的谷歌搜索“ fork scanf” 給了我答案

派生之后,輸入流將關閉。 因此scanf進入不良狀態。 以下程序是對您的程序的略微修改。 打印“流關閉”。

#include<stdio.h>
#include<unistd.h>
int main()
{
        int i = 1;
        if(!fork())
        {
                while(i)
                {
                        printf("Enter i");
                        int j = scanf("%d",&i); // changed
                        if(j == EOF) {             // added
                                printf("stream closed"); // added
                                return 1;       // added
                        }                       // added
                        fflush(stdin);
                        fflush(stdout);
                }
        }
        else
        {
                printf("Parent\n");
        }
        return(0);
}

暫無
暫無

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

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