1. 程式人生 > >在C / C ++中清除輸入緩衝區

在C / C ++中清除輸入緩衝區

筆者介紹:姜雪偉,IT公司技術合夥人,IT高階講師,CSDN社群專家,特邀編輯,暢銷書作者,已出版書籍:《手把手教你架構3D遊戲引擎》電子工業出版社和《Unity3D實戰核心技術詳解》電子工業出版社等。

     什麼是緩衝區?

臨時儲存區稱為緩衝區,所有標準輸入和輸出裝置都包含輸入和輸出緩衝器。在標準C / C ++中,流是緩衝的,例如在標準輸入的情況下,

當我們按鍵盤上的鍵時,它不會發送到您的程式,而是由作業系統緩衝,直到時間被分配給程式。

它如何影響程式設計?

在各種情況下,您可能需要清除不需要的緩衝區,以便獲得所需容器中的下一個輸入,而不是在前一個變數的緩衝區中。例如,在遇到“scanf()”之後的C的情況下,如果我們需要輸入一個字元陣列或字元,並且在C ++的情況下,遇到“cin”語句之後,我們需要輸入一
個字元陣列或一個字串,我們需要清除輸入緩衝區,否則所需的輸入由前一個變數的緩衝區佔用,而不是所需的容器。在第一次輸入後按輸出螢幕上的“回車”(回車),前一個變數的緩衝區為新容器的空間(因為我們沒有清除它),程式跳過容器的以下輸入。

C程式設計的情況下

#include<stdio.h>
int main()
{
    char str[80], ch;
     
    // Scan input from user -TestGame for example
    scanf("%s", str);
     
    // Scan character from user- 'a' for example
    ch = getchar();
     
    // Printing character array, prints “TestGame”)
    printf("%s\n", str);
     
    // This does not print character 'a'
    printf("%c", ch);
     
    return 0;
}

輸入:

TestGame
一個

輸出:

TestGame

   在C ++的情況下

#include<iostream>
#include<vector>
using namespace std;
int main()
{
    int a;
    char ch[80];
     
    // Enter input from user - 4 for example
    cin >> a;
     
    // Get input from user - "TestGame" for example
    cin.getline(ch,80);
     
    // Prints 4
    cout << a << endl;
     
    // Printing string : This does not print string
    cout << ch << endl;
 
    return 0;
}

輸入:

4
TestGame

輸出:

4
在上述兩種程式碼中,都不會根據需要列印輸出。原因是被佔用的緩衝區。“\ n”字元保留在緩衝區中,並作為下一個輸入讀取。

如何解決?

在C:

1、使用“while((getchar())!='\ n'); (鍵入)while((getchar())!='\ n');”讀緩衝區字元直到結束並丟棄它們(包括換行符),

並在“scanf()”語句清除輸入緩衝區之後使用它允許輸入到所需的容器中。

#include<stdio.h>
int main()
{
    char str[80], ch;
     
    // scan input from user - TestGame for example
    scanf("%s", str);
     
    // flushes the standard input (clears the input buffer)
    while ((getchar()) != '\n');
     
    // scan character from user - 'a' for example
    ch = getchar();
     
    // Printing character array, prints “TestGame”)
    printf("%s\n", str);
     
    // Printing character a: It will print 'a' this time
    printf("%c", ch);
 
    return 0;
}

輸入:

TestGame
一個

輸出:

TestGame
一個
2、使用“fflush(stdin)”:在“scanf()”語句之後鍵入“fflush(stdin)”也會清除輸入緩衝區,但是避免使用它,並且根據C ++被稱為輸入流“未定義” 11標準。

在C ++的情況下:

1、使用“cin.ignore(numeric_limits :: max(),'\ n'); : - 在”cin“語句之後輸入”cin.ignore(numeric_limits :: max(),'\ n');“後,放棄包含換行符的輸入流中的所有內容。
#include<iostream>
#include<ios>     // for <streamsize>
#include<limits>  // for numeric_limits
using namespace std;
int main()
{
    int a;
    char str[80];
     
    // Enter input from user - 4 for example
    cin >> a;
     
    // discards the input buffer
    cin.ignore(numeric_limits<streamsize>::max(),'\n');
     
    // Get input from user - TestGame for example
    cin.getline(str, 80);
     
    // Prints 4
    cout << a << endl;
     
    // Printing string : This will print string now
    cout << str << endl;
 
    return 0;
}

輸入:

4
TestGame

輸出:

4
TestGame
2、使用“cin.sync()”:在“cin”語句之後鍵入“cin.sync()”將放棄緩衝區中的所有內容。雖然“cin.sync()” 不工作在所有實施(根據C ++ 11和上述標準)。
#include<iostream>
#include<ios>     
#include<limits>  
using namespace std;
int main()
{
    int a;
    char str[80];
     
    // Enter input from user - 4 for example
    cin >> a;
     
    // Discards the input buffer
    cin.sync();
     
    // Get input from user - TestGame for example
    cin.getline(str, 80);
     
    // Prints 4
    cout << a << endl;
     
    // Printing string - this will print string now
    cout << str << endl;
 
    return 0;
}

輸入:

4
TestGame

輸出:

4
TestGame
使用“cin >> ws”:在“cin”語句之後鍵入“cin >> ws”,告訴編譯器忽略緩衝區,並且在字串或字元陣列的實際內容之前丟棄所有的空格。


相關推薦

C / C ++清除輸入緩衝區

筆者介紹:姜雪偉,IT公司技術合夥人,IT高階講師,CSDN社群專家,特邀編輯,暢銷書作者,已出版書籍:《手把手教你架構3D遊戲引擎》電子工業出版社和《Unity3D實戰核心技術詳解》電子工業出版社等。

C語言輸入輸出流和緩衝區(重點)詳解

導讀: C語言中我們用到的最頻繁的輸入輸出方式就是scanf()與printf()。 scanf(): 從標準輸入裝置(鍵盤)讀取資料,並將值存放在變數中。 printf(): 將指定的文字/字串輸出到標準輸出裝置(螢幕)。注意寬度輸出和精度 輸出控制。 C語言藉助了相應的緩衝區

C語言清除輸入緩衝區【轉】

在使用scanf輸入時,如果輸入不合法,此時可以檢查其返回值為0,但下次再呼叫時,上次不合法的輸入,還在輸入緩衝區中,此時就會接著不合法,如下:#include <stdio.h>int main(int argc,char** argv){          i

C語言輸入方式

讀取 緩沖區 lock 回車 scanf() spa sdn enter 回車符 在c語言中,有gets()、scanf()、getchar()等輸入方式,但是不同的方式處理的方式不同。 scanf()讀取時遇見tab、space、enter時會結束讀取,不會舍棄最後的回車

C++函式輸入以及如何使用總結

   1.輸入的是陣列的名稱  :           int f(int arr[])型別   arr等於陣列第一個元素的地址: arr == &arr[0] int f(int arr[]); //輸入的是陣列的名稱即指標。 int main() {

C語言輸入輸出函式(學習筆記)

文章目錄 c語言中的基本輸入與輸出函式 1.格式化輸入輸出函式 1.1printf()函式 1.2scanf()函式 2.非格式化的輸入輸出函式 2.1puts()和gets()函式

C語言清空輸入緩衝區

先來看一段程式碼: #include <stdio.h> int main() { int num; char ch ; scanf("%d", &num); scanf("%c", &ch); printf("hello world

c語言統計輸入的行數、單詞數與字元數

來源:《c程式設計語言》 功能需求: 寫個函式,用於統計輸入的行數、單詞數與字元數。這裡對單詞的定義比較寬鬆,它是任何其中不包含空格、製表符或換行符的字元序列。 程式碼如下: #include <stdio.h> #define IN 1 #define OUT 0 void wc()

c++IO輸入輸出流總結<二>

操作 clu 文件 blog trunc pub filename binary team 1 文件的打開和關閉 1.1 定義流對象   ifsteam iflie;//文件輸入流對象   ifsteam iflie;//文件輸出流對象   fsteam iflie;//文

scanf()的%c 不能正常輸入的問題

urn 輸入流 pri blog 問題 sca 但是 char amp #include <stdio.h> int main() { char a; int b; scanf("%d",&b); scan

C++輸入問題

dea int .so i+1 .com clas 回車 區別 一個 C++中幾個輸入函數的用法和區別(cin、cin.get()、cin.getline()、getline()、gets()、getchar())) 1、cin1、cin.get()2、cin.ge

C語言字符輸入問題

nbsp clas 輸入緩沖 show bsp 解決 har 問題 c語言 先上例題,一道太水太水的題, http://acm.hdu.edu.cn/showproblem.php?pid=1170 讓做一個簡單的計算器。然而入坑了。 #include<stdio.

C#Form.SplitContainer清除控制元件textbox值(窗體.容器.控制元件)

文章目錄 問題背景 問題程式碼 問題解決 正確清除程式碼 問題延申 問題背景 早上在完善不確定度計算器時,想要清空實驗資料輸入時所有textbox控制元件值。 問題程式碼

C/C++實現對輸入到EOF的判斷、鍵盤手動輸入檔案結尾符EOF、Python輸入EOF判斷

C/C++中實現對輸入到EOF的判斷: 在C/C++中,EOF是一個定義在標頭檔案 stdio.h 中的常量,等於-1。 在C/C++中實現遇到檔案結尾符停止讀取: int data; while(scanf("%d",&data)!=EOF){ //EOF即檔案結尾符,-1

如何在C語言程式統計輸入漢字的個數

C中的漢字用“機內碼”,一個漢字兩位元組,最高位都是1,所以可以用下列程式碼求得一個字串裡漢字的個數: #include<stdio.h> #include<string.h> int main() { char s[1000]; int cn,i,all; whil

C語言:判斷輸入一行是否包含模式串

C語言:函式與程式結構11 #include<stdio.h> 2 #define MAXLINE 1000 /*最大輸入行長度 */ 3 4 int getline(char line[], int max); 5 int strindex(char source[], c

C/C++一些基本的輸入輸出用法

1.scanf()與printf() %c格式能夠識別空格和換行並將其輸入 %s通過空格和換行來識別字符串的結束 2.getchar()與putchar() 用來輸入和輸出單個字元 3.gets()與puts() 用來輸入一行字串,gets()識別換行符來

查詢輸入整數二進位制1的個數/華為機試(C/C++)

題目描述 請實現如下介面      public   static   int  findNumberOf1( int num)     {          /*  請實現  */     

C++重新整理輸出緩衝區

每一個輸出流都管理一個緩衝區,用來儲存程式讀寫的資料。因此要將資料真正寫到輸出裝置中,就需要重新整理緩衝區。導致緩衝區重新整理的原因大體有以下5種。 1、程式正常結束,作為main函式return操作的一部分,緩衝區被重新整理。 2、當緩衝區滿了的時候,會重新整理緩衝區。 3、可以使用操

C++11vector的emplace_back用法及輸入輸出操作符的過載

#include <vector> #include <iostream> #include <string> using namespace std; struc