![](/img/trans.png)
[英]Unexpected input when using getchar(), and unexpected output using putchar()
[英]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.