簡體   English   中英

使用getchar()意外輸出

[英]unexpected output with getchar()

char c = ' ';
while(c != 'x')
{       
    c = getchar();
    printf("threadFuncParam = %u\n", threadFuncParam);
}

在上面的代碼片段中,每次我輸入一個字符時,打印兩次都會打印threadFuncParam值,因為我希望它只打印一次。 根據我的理解,它是在條件為真時第一次進入的,然后在輸入字符時等待getchar調用中的用戶輸入,它將打印該值,然后如果輸入字符不是x,則它將在getchar調用中等待另一個輸入,但是每當我輸入一個字符時,我都會為每個輸入看到2個打印離子屏幕。 我不明白為什么?

我要在這里做的是,在主線程中,我從用戶處獲取單個字符輸入,在工作線程中,我正在遞增一個計數器,計數器每秒遞增一次,每次用戶輸入字符輸入時,我都會打印該值,直到用戶輸入“ x'字符。

此處的簡單問題是,控制台(輸入)僅在遇到Enter鍵或ctr+d時才將文本發送到stdin

結果,額外的\\n進入了輸入流。 這會使您的程序在下一次迭代中讀取該字符。

一個簡單的解決方案是讀取流中的所有空白字符。

這可以通過多種方式完成-

如果您需要舍棄任何空白字符(包括空格,制表符,vtab,換行符),則可以添加

scanf(" ");

getchar();之前getchar();

如果您只需要丟棄按回車鍵產生的換行符,則可以添加

scanf("%*[\n]")

getchar();之前getchar();

這會吃掉下一個字符之前的所有\\n 但是不會吃空間。

最后,如果您只想丟棄1 \\n

你可以做

scanf("%*1[\n]");

但是請記住 ,在所有情況下, scanf應該緊接在getchar()之前,因為scanf會等到找到下一個非空白字符。

所有案例都在@chux的評論幫助下找到了。

如果您嘗試調試程序(這是學習編碼的最佳方法),則會發現第二個值每次都是10 在ASCII表中,您會發現這是換行的代碼。 每個字符后要按的鍵。 然后通過快速簡單的搜索,您將發現此螺紋 問題描述在哪里,您將輕松解決。

char c = ' ';
while(c != 'x')
{
    printf("threadFuncParam = %u\n", (char)c);
    fflush(stdout);
    if (scanf(" %c",&c) != 1)
    {
        // failed
    }
}

我認為問題在於邏輯的應用方式。 在檢查條件之前先進行打印 參見以下說明:

循環1:對值'a'執行getchar()聲明。
printf()已執行。
循環2:因為c ='a',所以條件為true。 現在,使用'x'值執行getchar()。 再次執行printf()。
循環3:條件評估為假。 循環終止。

因此,基本上,您應該稍微改變一下邏輯。

暫無
暫無

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

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